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 }

 

posted @ 2020-03-17 22:03  古比  阅读(134)  评论(0编辑  收藏  举报