光仔december 2014-05-14 1421浏览量
样例输入
2样例输出
120思路摘自:http://blog.csdn.net/sevenmit/article/details/8959923
这是双进程DP问题,首先,假设出发点为A 终点为B 那么,根据题目给出的条件,可以推出A->B的动态转移方程为 dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + a[i][j]; 由于,同理可得B的情况,那么,题目的意思是A->B 然后 B -> A我们可以假设同时从A点出发,得到两条不同路径,这个是一样的效果。所以,我们可以得到一个动态转移方程还有一点要注意一下,这题与NYOJ 61是同类问题,但是,有一点细节要注意,最后终点的值也要算上,上面的动态方程得到的值不包含两个A 和 B的值,因为 A是起点,所以,他的值一般是0,所以,得到最后的结果应该是 int sum = max(dp[m-1][n][m-1][n],dp[m-1][n][m][n-1],dp[m][n-1][m-1][n],dp[m][n-1][m][n-1]) + a[m][n];
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[60][60]; int dp[60][60][60][60]; int max(int n,int m) { return n>m?n:m; } int main() { int i,j,T,n,m; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&a[i][j]); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) for(j=0;j<m;j++) { for(p=i+1;p<n;p++) q=i+j-p; if(q <= 0) continue; dp[i][j][p][q] = max(max(dp[i-1][j][p-1][q],dp[i][j-1][p][q-1]), max(dp[i-1][j][p][q-1],dp[i][j-1][p-1][q])) + a[i][j] + a[p][q]; } int sum = max(max(dp[m-1][n][m-1][n],dp[m-1][n][m][n-1]), max(dp[m][n-1][m-1][n],dp[m][n-1][m][n-1])); printf("%d\n",sum+a[m][n]); } return 0; }
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目