P1004 方格取数
P1004 方格取数
题解
我们可以两遍路一起走
f[i][j][k][l] 表示第一条路走到(x,y ),第二条路走到(k,l)时的最大值
然后转移
判断(x,y)(k,l)是否相同就好
代码
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> using namespace std; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } int n; int a[10][10]; int f[10][10][10][10]; int main() { scanf("%d",&n); int x,y,z; while(scanf("%d%d%d",&x,&y,&z)) { if(x==0&&y==0&&z==0) break; a[x][y]=z; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) for(int l=1;l<=n;l++) { 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]))) +a[i][j]+a[k][l]; if(i==k&&j==l) f[i][j][k][l]-=a[i][j]; } printf("%d",f[n][n][n][n]); return 0; }
点击获得双倍经验!
P1006 传纸条