P1004 方格取数
题意:给出一个n*n的矩阵,然后每一个位置有一定权值;
要求从(1,1)走两条路径到(n,n)使最后结果最大(走的时候带走格内权值)
思路:题目给出的数据范围极度小,n<10;
所以我们可以开四维DP dp【i】【j】【k】【l】
表示第一个人处于(i,j)位置,第二人处于(k,l)位置时候的最大值;
那么我们只需要从小到大遍历一遍,即可;
而在遍历的时候,倘若两个人的坐标一致,那么格内权值只能取一次,所以需要减一次
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=20; 4 int G[maxn][maxn]; 5 int dp[maxn][maxn][maxn][maxn]; 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 int x,y,z; 11 scanf("%d%d%d",&x,&y,&z); 12 while(x||y||z){ 13 G[x][y]=z; 14 scanf("%d%d%d",&x,&y,&z); 15 } 16 for(int i=1;i<=n;i++){ 17 for(int j=1;j<=n;j++){ 18 for(int k=1;k<=n;k++){ 19 for(int l=1;l<=n;l++){ 20 int tmp1=max(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l]); 21 int tmp2=max(dp[i-1][j][k][l-1],dp[i][j-1][k][l-1]); 22 dp[i][j][k][l]=max(tmp1,tmp2)+G[i][j]+G[k][l]; 23 if(i==k&&j==l) dp[i][j][k][l]-=G[i][j]; 24 } 25 } 26 } 27 } 28 printf("%d\n",dp[n][n][n][n]); 29 return 0; 30 }