【题目描述】

    设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

【题目链接】

    http://noi.openjudge.cn/ch0206/8786/

【算法】

    醉了,一开始以为很简单分成两次呗,走完一遍第一次路径经过的点记为0,但是感觉有点不对劲,因为第一次走过路可能会影响第二次,也就是有后效性,分开计算状态空间中有很多种情况并没有遍历到。然后看书。。。。所以要多线程dp,设dp【a】【b】【c】【d】表示第一次走到【a】【b】点第二次走到【c】【d】点状态下获得的最大分数,状态方程倒是不难。

【代码】

 #include <bits/stdc++.h>
using namespace std;
int n,i,j,tmp,a,b;
int puz[][],dp[][][][];
int main()
{
scanf("%d",&n);
while(scanf("%d%d%d",&i,&j,&tmp)&&i)
puz[i][j]=tmp;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
for(a=;a<=n;a++)
for(b=;b<=n;b++) {
dp[i][j][a][b]=max(max(dp[i-][j][a-][b],dp[i][j-][a][b-]),
max(dp[i-][j][a][b-],dp[i][j-][a-][b]))+puz[i][j];
if(i!=a||j!=b) dp[i][j][a][b]+=puz[a][b];
}
printf("%d\n",dp[n][n][n][n]);
return ;
}

最新文章

  1. Vertica环境安装R-Lang包提示缺少libgfortran.so.1
  2. 【转载】学习资料存档:jQuery的deferred对象详解
  3. poj 1654 Area 多边形面积
  4. 2、Python djang 框架下的word Excel TXT Image 等文件的下载
  5. iOS 点击cell下拉
  6. Inno Setup:获取isl中的多国语言字串
  7. 使用Maven打包项目并上传到Linux服务器
  8. linux分区-df
  9. 201521123039 《java程序设计》第八周学习总结
  10. C语言结构体作业
  11. Intellij idea常用快捷键和技巧
  12. Linux防火墙开放端口
  13. (网页)JS和CSS不缓存方法,时间戳
  14. 运行Xcode时,提示:An error was encountered while running (Domain = FBSOpenApplicationErrorDomain, Code = 4)
  15. Linux的日志管理
  16. HDU 2655 主席树
  17. flink checkpoint 源码分析 (一)
  18. js 根据所输内容生成助记码
  19. Vmware 可用的激活码
  20. 无记录时显示gridview表头,并增加一行显示“没有记录”【绑定SqlDataSource控件时】

热门文章

  1. AI-sklearn 学习笔记(一)sklearn 一般概念
  2. Node.JS-经典教程
  3. pg_config - 检索已安装版本的 PostgreSQL 的信息
  4. c++ sizeof的实现
  5. python-验证功能的装饰器示例
  6. 02cython调用c++文件
  7. GNU linker script,ld script,GNU链接脚本
  8. Mardown加上目录
  9. proxyTable-后端代理-跨域请求数据
  10. 2018年第九届山东省ACM省赛总结