soj1767.传纸条
2024-08-24 02:27:09
这道题目想了一会儿觉得不知道如何下手,上网看了下资料,原来这道是一道非常经典的题目。
设 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;
}
最新文章
- 12款非常精致的免费 HTML5 &; CSS3 网站模板
- JS截取字符串
- BurpSuite设置公共WIFI抓包
- 【初级】linux mkdir 命令详解及使用方法实战
- @SuppressWarnings的使用、作用、用法
- WPF QuickStart系列之线程模型(Thread Model)
- uva 10340 All in All
- 发送xml报文去第三方请求获取xml报文数据
- js addEventListener attachEvent
- 观察者模式(Observer)
- jquery upgrade
- http缓存与cdn相关技术
- CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇
- sublime text3 支持终端打开文件
- 201521123104 《Java程序设计》第8周学习总结
- alfs学习笔记-自动化构建lfs系统
- Ubuntu Server 16.04 安装MySQL并设置远程访问
- oracle 任务备份
- python No tests were found问题解决方法
- C# 写App.config配置文件的方法