方格取数(luogu 1004)
Posted qseer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方格取数(luogu 1004)相关的知识,希望对你有一定的参考价值。
测评传送门
做法:
和传纸条很像,但有一点小区别
最基本的做法,开四维暴力DP,能更新则更新
我们也可以通过更新每一层的状态,用曼哈顿距离,就可以通过一维表示出另一维,大大节省了空间时间
code【1】
#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; }
code【2】
#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; }
以上是关于方格取数(luogu 1004)的主要内容,如果未能解决你的问题,请参考以下文章