P1004 方格取数

题目链接:https://www.luogu.org/problemnew/show/P1004
emmmmmm
那么这个题目吧,也是好久之前做的,理解了一下代码,下面大概说一下做法哈
嗯首先,因为只要走两次,so我们可以假设一个从(1,1)开始向(n,n)走,而另一个从(n,n)开始向(1,1)走
实际上呢这题很想下午说的数字三角形变换的数字正方形,当然,做两次
那么因为n过小,so开四维也无所谓,前两维i,j表示第一个人走到(i,j)能够达到的做大值,而后两维k,l表示第二个人走到(k,l)时能达到的最大值
有一点需要注意的是如果两个人走到了同一位置,那么就需要减掉一次这一位置的数字
下面贴上代码:

 1 #include<set>
 2 #include<map>
 3 #include<list>
 4 #include<queue>
 5 #include<stack>
 6 #include<string>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<vector>
10 #include<bitset>
11 #include<memory>
12 #include<utility>
13 #include<cstdio>
14 #include<sstream>
15 #include<iostream>
16 #include<cstdlib>
17 #include<cstring>
18 #include<algorithm>
19 using namespace std;
20 
21 int n;
22 int a[10][10],f[10][10][10][10];
23 
24 int ma(int a,int b){return a>b?a:b;}
25 
26 int main(){
27     scanf("%d",&n);
28     while(1){
29         int x,y,z;
30         scanf("%d%d%d",&x,&y,&z);
31         if(x==0&&y==0&&z==0){
32             break;
33         }
34         a[x][y]=z;
35     }
36     for(int i=1;i<=n;i++){
37         for(int j=1;j<=n;j++){
38             for(int k=1;k<=n;k++){
39                 for(int l=1;l<=n;l++){
40                     f[i][j][k][l]=ma(f[i-1][j][k-1][l],ma(f[i][j-1][k-1][l],ma(f[i-1][j][k][l-1],f[i][j-1][k][l-1])))+a[i][j]+a[k][l];
41                     if(i==k&&j==l){
42                         f[i][j][k][l]-=a[i][j];
43                     }
44                 }
45             }
46         }
47     }
48     printf("%d\n",f[n][n][n][n]);
49     return 0;
50 }

日常嘤嘤嘤

and

新人开博鼓励一下吧(哭唧唧)~~

posted @ 2019-07-17 11:36  喵呜,颜儿ღ  阅读(106)  评论(0编辑  收藏  举报