题目链接: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 ",f[n][n][n][n]); 49 return 0; 50 }
日常嘤嘤嘤
and
新人开博鼓励一下吧(哭唧唧)~~