51Nod1084矩阵取数问题 V2
题意:
一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。
solution:
把题目转化成两个人从左上角出发,走到右下角的奖励之和
设dp[i][j][p][q]为第一个人在(i,j)点,第二个人在(p,q)点的最大奖励之和
四重循环复杂度爆炸
我们发现i+j=p+q;
所以转化为dp[k][i][j]为走了k步,第一个人在i行,第二个人在j行,列可以用k-i,k-j表示
并可以用滚动数组优化
注意i=j时只需要加一个值
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int n,m,f[210][210],s[210][210]; 6 int main(){ 7 scanf("%d%d",&m,&n); 8 for(int i=1;i<=n;++i) 9 for(int j=1;j<=m;++j) scanf("%d",s[i]+j); 10 for(int k=2;k<=m+n;++k) for(int i=n;i;--i) for(int j=n;j;--j) 11 f[i][j]=max(max(f[i][j],f[i-1][j-1]),max(f[i-1][j],f[i][j-1]))+s[i][k-i]+(i!=j?s[j][k-j]:0); 12 printf("%d ",f[n][n]); 13 }
矩阵取数问题 V2