标签:submit 预处理 span oid cstring set status printf 经典
Time Limit: 2 Sec Memory Limit: 512 MB
# include <iostream> # include <cstdio> # include <cstring> # include <algorithm> using namespace std; int f[52][52][22][22],a[52],b[52],s[52][52],g[52][52][52],h[52][52][52],n,m,K,dt; bool cmp(int x,int y){return x > y;} void init() { memset(g,0,sizeof g); memset(h,0,sizeof h); for(int i = 1;i <= n;i++) { dt = 0; for(int j = m;j >= 1;j--) { sort(a + 1,a + dt + 1,cmp); for(int k = 1;k <= dt;k++)b[k] = b[k - 1] + a[k],g[i][j][k] = b[k]; a[++dt] = s[i][j]; } } for(int j = 1;j <= m;j++) { dt = 0; for(int i = n;i >= 1;i--) { sort(a + 1,a + dt + 1,cmp); for(int k = 1;k <= dt;k++)b[k] = b[k - 1] + a[k],h[i][j][k] = b[k]; a[++dt] = s[i][j]; } } memset(f,0x80,sizeof f); f[1][1][0][0] = s[1][1]; f[1][1][1][0] = 0; } int main() { int Case;scanf("%d",&Case); while(Case--) { scanf("%d %d %d",&n,&m,&K); for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++) scanf("%d",&s[i][j]); init(); for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++) for(int k = 0;k <= K;k++) for(int l = 0;l <= K;l++) { for(int t = 0;t <= min(K - l,m - j);t++) f[i + 1][j][k][l + t] = max(f[i + 1][j][k][l + t],f[i][j][k][l] + s[i + 1][j] + g[i][j][t]), f[i + 1][j][k + 1][l + t] = max(f[i + 1][j][k + 1][l + t],f[i][j][k][l] + g[i][j][t]); for(int t = 0;t <= min(K - l,n - i);t++) f[i][j + 1][k][l + t] = max(f[i][j + 1][k][l + t],f[i][j][k][l] + s[i][j + 1] + h[i][j][t]), f[i][j + 1][k + 1][l + t] = max(f[i][j + 1][k + 1][l + t],f[i][j][k][l] + h[i][j][t]); } int ans = 0; for(int i = 0;i <= K;i++)ans = max(ans,f[n][m][i][i]); printf("%d\n",ans); } }
[Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)
标签:submit 预处理 span oid cstring set status printf 经典
原文地址:https://www.cnblogs.com/lzdhydzzh/p/9098771.html