abc227F - Treasure Hunting

abc227F

依次钦定x为路径上的第k大的数,然后dp即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<bitset>
#include<cmath>
#include<set>
#include<unordered_map>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define A puts("Yes")
#define B puts("No")
using namespace std;
typedef double db;
typedef long long ll;
//typedef __int128 i128;
const int N=2e5+10;
//const int inf=1ll<<60;
const ll inf=1ll<<60;
const ll mo=1e9+7;
ll f[80][35][35],a[50][50];
ll n,m,k,val,ans=inf;
void cmin(ll &x,ll y){
	x=min(x,y);
}
void solve(){
	fo(x,0,k) fo(i,0,n) fo(j,0,m) f[x][i][j]=inf;
	
	if (a[1][1]<=val) f[0][1][1]=0; 
	if (a[1][1]>=val) f[1][1][1]=a[1][1];
	
	fo(x,0,k) {
		fo(i,1,n) fo(j,1,m) {
			if (a[i][j]>=val) {
				if (x>=1) {
					cmin(f[x][i][j], f[x-1][i-1][j]+a[i][j]); 
					cmin(f[x][i][j], f[x-1][i][j-1]+a[i][j]);
				}
			}
			if (a[i][j]<=val) {
				cmin(f[x][i][j], f[x][i-1][j]);
				cmin(f[x][i][j], f[x][i][j-1]);
			}
		}
	}
	
	ans=min(ans, f[k][n][m]);
}
int main()
{
//	freopen("data.in","r",stdin);
	
	scanf("%lld %lld %lld",&n,&m,&k);
	fo(i,1,n) fo(j,1,m) scanf("%lld",&a[i][j]);
	
	fo(x,1,n) fo(y,1,m) {
		val=a[x][y];
		solve();
	}
	
	printf("%lld",ans);
	return 0;
}

	
 
 
posted @ 2024-01-18 19:31  gan_coder  阅读(11)  评论(0)    收藏  举报