呜呜呜这题太虐心了呜呜呜,花了整整两天的时间才把错误找出来,多亏了电子科大的两位金牌的指导。。。

题目描述 Description

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。

还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

输入描述 Input Description

输入的第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1<=m,n<=50)。

接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。每行的n个整数之间用空格隔开。

输出描述 Output Description

输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

样例输入 Sample Input

3 3

0 3 9

2 8 5

5 7 0

样例输出 Sample Output

34

数据范围及提示 Data Size & Hint

30%的数据满足:1<=m,n<=10

100%的数据满足:1<=m,n<=50

  这道题的思路很简单,拿到我就想跑两次dp,再把两次dp的结果加起来,但是这样贪心的做法显然是错误的,为了得到最优解,我们必须把连个纸条的坐标状态都记录下来。把先不考虑任何时间,空间上的优化,假设纸条都从左上角传到右下角,我们如果用记忆化搜索的方法,我们定义dp[x1][y1][x2][y2]为两张纸条分别到(x1,y1)和(x2,y2)时,再到终点所能得到的最大好心度之和,状态的定义就这么简单。。。

  然后我们来考虑状态转移,其实思路也和经典的记忆化搜索一样,dp[x1][y1][x2][y2]=max{所有能够转移的点集合}+map[x1]

  [y1]+map[x2][y2]。当然这里要处理一下,如果x1==x2&&y1==y2,则这种状态是不可能达到的,必须去掉。然而我却在这里出了个大错。。。这里必须要考虑到终点的情况,因为到终点的时候两者必定会相同,如果不特判一下的话,到终点的最后一次转移的获利就会丢失。。。这里坑了我一天。。。想起就心痛。。。

  其他的地方没什么好说的了,代码如下:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 const int maxn=51;
 7 int map[maxn][maxn];
 8 int dp[maxn][maxn][maxn][maxn];
 9 int d[2][2]={{0,1},{1,0}};
10 int n,m;
11 void read()
12 {
13     cin>>m>>n;
14     for(int i=1;i<=m;i++)
15     {
16         for(int j=1;j<=n;j++)
17         {
18             scanf("%d",&map[j][i]);
19         }
20     }
21 }
22 bool check(int x1,int y1,int x2,int y2)
23 {
24     if(x1>n || x1<1 || x2>n || x2<1 || y1>m || y1<1 || y2>m || y2<1 ) return false;
25     if(x1==x2 && y1==y2 && !(x1==n && y1==m)) return false;
26     return true;
27 }
28 int dfs(int x1,int y1,int x2,int y2)
29 {
30     if(dp[x1][y1][x2][y2]) return dp[x1][y1][x2][y2];
31     for(int i=0;i<=1;i++)
32     {
33         int xx1=x1+d[i][0];
34         int xy1=y1+d[i][1];
35         for(int j=0;j<=1;j++)
36         {
37             int xx2=x2+d[j][0];
38             int xy2=y2+d[j][1];
39             if(check(xx1,xy1,xx2,xy2))
40             {
41                 dp[x1][y1][x2][y2]=max(dp[x1][y1][x2][y2],dfs(xx1,xy1,xx2,xy2)+map[x1][y1]+map[x2][y2]);
42             }
43         }
44     }
45     return dp[x1][y1][x2][y2];
46 }
47 int main()
48 {
49     read();
50     cout<<dfs(1,1,1,1);
51     return 0;
52 }

我看到网上很多题解的状态转移都没有判断是否重点,而是全部转移,之和加上这句:

if(nx1==nx2 && ny1==ny2) dp[x1][y1][x2][y2]-=map[x1][x2]。

卧槽这是什么鬼。。。谁能给我解释下。。。

转载于:https://www.cnblogs.com/sajuuk/p/4693249.html

【NOIP】【codevs】【DP】1169传纸条相关推荐

  1. 棋盘型动态规划 之 CODE[VS] 1169 传纸条 2008年NOIP全国联赛提高组

    /* 这道题要解决两个问题1)状态和状态方程2)怎么保证每走一步,所形成的路径不相交,以保证最后生成的完整路径不相交.(1)状态: dp[i][j][k][l] = 小渊传递的纸条到[i][j]的位置 ...

  2. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  3. 洛谷P1006 传纸条(多维DP)

    小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们 ...

  4. NYOJ 61:传纸条(一)(三维DP)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  5. SDNU 1194.传纸条(DP) 1032.机器人

    Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交 ...

  6. nyoj 61 传纸条(一)双线程DP

    传纸条(一) 时间限制: 2000 ms  |  内存限制: 65535 KB 难度: 5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m ...

  7. 洛谷1006 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  8. nyoj 61 传纸条(一) (双线动归)nyoj 探寻宝藏

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  9. NYOJ 61 传纸条(一)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

最新文章

  1. linux内核spi总线驱动分析,Linux下的SPI总线驱动(三)
  2. 阿里强化学习入选MIT十大突破 “新技术”
  3. UIControl UIImage
  4. 一键回到页面顶部_微信上线新功能!长期不看的公众号,帮你一键拒收
  5. Easy-RSA 3快速入门自述文件
  6. 坑爹系列:sizeof运算符
  7. mysql的读写分离工具_mysql 读写分离工具
  8. ccf中文期刊目录_37本!中国计算机学会CCF首次发布推荐中文科技期刊目录
  9. AD用SmartPDF导出原理图标号显示不全解决方法
  10. 传统项目管理和敏捷项目管理的区别是什么?
  11. 计算机桌面底边出现库如何去掉,桌面图标有蓝底怎么去掉
  12. Python分析并绘制可视化动态地图,实时查询全球疫情数据(11月最新...)
  13. ETL开发过程中遇到的问题
  14. ESXI 6.7 环境 centos7.6 虚拟机安装tesla k80 显卡驱动失败问题解决
  15. 微信小程序讲解ppt(内附ppt资源及网易云api案例)
  16. Unity 粒子特效—FX Maker
  17. 零基础YOLOv5的详细使用教程
  18. MongoDB之文本搜索
  19. 文摘 - 石仁寿:一场人性的悲剧
  20. 华为服务器北向接口协议,北向接口

热门文章

  1. PlatformIO IDE搭建统一的物联网嵌入式开发环境
  2. 网页显示QQ在线点击弹出聊天对话框代码
  3. 辛弃疾最有代表性的十首词
  4. 6、网关 复杂分支流程
  5. 自私型人格分析,如何改变自私型性格?
  6. APP规范实例(详细的UI设计方法)
  7. 玩转华为ENSP模拟器系列 | 配置IS-IS负载分担示例
  8. 平生事,此时凝睇,谁会凭栏意!(2)
  9. 开源在线excel编辑器_推荐3款爽到爆的在线网站
  10. 操作系统安全防护技术