标签:www region ADG 通过 div print max 输出 algorithm
和传纸条很像,但有一点小区别
最基本的做法,开四维暴力DP,能更新则更新
我们也可以通过更新每一层的状态,用曼哈顿距离,就可以通过一维表示出另一维,大大节省了空间时间
#include<stdio.h> #include<algorithm> using namespace std; int mp[11][11],f[11][11][11][11]; int main() { int n,x,y,c; scanf("%d",&n); while(scanf("%d%d%d",&x,&y,&c) && x && y && c) mp[x][y]=c; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) for(int k=1;k<=n;++k) { int l=i+j-k; if(l<=0) break; f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1]))); if(i==k && j==l) f[i][j][k][l]+=mp[i][j]; else f[i][j][k][l]+=mp[i][j]+mp[k][l]; } printf("%d",f[n][n][n][n]); return 0; }
#include<stdio.h> #include<algorithm> using namespace std; int mp[11][11],f[11][11]; int main() { int n,x,y,c; scanf("%d",&n); while(scanf("%d%d%d",&x,&y,&c) && x && y && c) mp[x][y]=c; for(int l=2;l<=n+n;++l) for(int i=l-1;i>=1;--i) for(int ii=l-1;ii>=1;--ii) { int j=l-i,jj=l-ii; f[i][ii]=max(f[i][ii],max(f[i-1][ii-1],max(f[i-1][ii],f[i][ii-1])))+mp[i][j]; if(i!=ii) { f[i][ii]+=mp[ii][jj]; } } printf("%d",f[n][n]); return 0; }
标签:www region ADG 通过 div print max 输出 algorithm
原文地址:https://www.cnblogs.com/qseer/p/9800619.html