这道题目想了一会儿觉得不知道如何下手,上网看了下资料,原来这道是一道非常经典的题目。

设 f [ k ][ i ][ j ] 表示第 k 步,第 1 条路径走到第 i 行,第 2 条路径走到第 j 行的最大权值和。
      状态转移方程:
      f [ k ][ i ][ j ] = max { f [ k - 1 ][ i - 1 ][ j ], f [ k - 1 ][ i ][ j - 1 ], f [ k - 1 ][ i ][ j ], f [ k - 1 ][ i - 1 ][ j - 1 ] } + map[ i ][ k - i ] + map[ j ][ k - j ]
      ( 2 <= k <= m + n, 1 <= i, j <= min { m, k - 1 }, i != j )

#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int paper[110][52][52];
int map[52][52];
int Max(int a,int b,int c,int d)
{
return max(max(a,b),max(c,d));
}
int main()
{
int m, n;
while (cin >> m >> n)
{
memset(paper,0,sizeof(paper));
int i,j,k;
for (i = 1; i <= m; i ++)
{
for (j = 1; j <= n; j ++)
{
cin >> map[i][j];
}
}
memset(paper, 0, sizeof(paper));
for (k = 1; k <= m + n; k ++)
{
for (i = 1; i <= min(m,k-1); i ++)
{
for (int j = 1; j <= min(m,k-1); j ++)
{
if (k != m + n && i == j)
continue;
else
{
paper[k][i][j] = Max(paper[k - 1][i - 1][j], paper[k - 1][i][j - 1], paper[k - 1][i][j], paper[k - 1][i - 1][j - 1]);
paper[k][i][j] += map[i][k - i] + map[j][k - j];
}
}
}
}
cout << paper[m+n][m][m] << endl;
}
return 0;
}

最新文章

  1. 12款非常精致的免费 HTML5 &amp; CSS3 网站模板
  2. JS截取字符串
  3. BurpSuite设置公共WIFI抓包
  4. 【初级】linux mkdir 命令详解及使用方法实战
  5. @SuppressWarnings的使用、作用、用法
  6. WPF QuickStart系列之线程模型(Thread Model)
  7. uva 10340 All in All
  8. 发送xml报文去第三方请求获取xml报文数据
  9. js addEventListener attachEvent
  10. 观察者模式(Observer)
  11. jquery upgrade
  12. http缓存与cdn相关技术
  13. CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇
  14. sublime text3 支持终端打开文件
  15. 201521123104 《Java程序设计》第8周学习总结
  16. alfs学习笔记-自动化构建lfs系统
  17. Ubuntu Server 16.04 安装MySQL并设置远程访问
  18. oracle 任务备份
  19. python No tests were found问题解决方法
  20. C# 写App.config配置文件的方法

热门文章

  1. 解决Shiro+SpringBoot自定义Filter不生效问题
  2. mongodb的命令介绍
  3. cmd命令行安装,删除Windows证书(certgmr的简单使用)
  4. 再谈MySql索引
  5. dp的一些计划
  6. 【bzoj1095】 ZJOI2007—捉迷藏
  7. 【arc102E】Stop. Otherwise...
  8. git 生成公匙私匙
  9. python入门:求1-2+3-4+5...99的所有数的和
  10. CDOJ--1056