题目梗概

首先题目和数字三角形那道经典的DP题目描述一样,不过增加了两处不同:

1.同行之间可以相邻移动

2.位置(i,j)(i,j),它与(i-1,j-1)(i−1,j−1)以及(i-1,j)(i−1,j)相邻,特别的(i,1)(i,1)与(i-1,i-1)(i−1,i−1)相邻,且(i,i)(i,i)与(i-1,1)(i−1,1)相邻.

思考

首先第一点我们只要在数字三角形的基础上,加上每行的移动就可以了。

但是第二点就要注意了,这样的描述使DP变成了环形。

具体的解释看这位大佬(PowderHan大佬的想法)

f[i][j]表示第i行第j个点到目标终点(1,1)的最小时间
则转换为数字三角形问题,但是只是多了几种走法,不断更新最小值就好了
但是问题就来了,这样动态规划具有最优子结构吗?
注意这是个环形走法
答案是不成立于的,怎么说?
我们来看一下这样一个例子,假设某个数据的第某层的时间为
1,1,1,1,1,1
而从下往上推上来一开始的初值f[][]分别为
1,2,4,3,9,10
那么我们先进行第一次同行内从左往右的更新的递推(可以看代码内的推法)
则有更新为
1,2,3,3,4,5
再从右往左更新推一遍
1,2,3,3,4,2(左端的1可以走到右端来更新了右端的时间)
那么这样就完了吗?不,我们可以发现我们可以用新更新的2去更新推出更优的解
则应该为
1,2,3,3,3,2
所以从这个样例中我们可以看出一次两边推根本的不出最优解
为什么呢?
我们看某次往一边推,由于是环形,所以可能从右向左推,用第一个更新了最右端的那个点
但是最右端的那个点在更新之前已经推完了右边数的第二个点
就是新更新的这个右端点并没有用来当作"下家"来更新别的点使别的点更优
同理从左往右也是一样
那么怎么办呢?
我们可以推两遍,这样假如更新了某个端点的值,在下一次递推时一定能用来作为"下家"尝试再更新别的点
那么这样问题就解决了
我们总结一下做法
首先每个点的初值为从下一层走到这一层的两个更优解
然后我们在同层迭代递推,左推一遍右推一遍,然后再重复推一遍

问题就解决了,so easy.

代码实现:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;const int maxn=1005;
int a[maxn][maxn];
int f[maxn][maxn];
int n;int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)cin>>a[i][j];f[1][1]=a[1][1];//终点处就直接是该点时间for(int i=2;i<=n;i++)//一层一层往上推
    {for(int j=2;j<i;j++)//先求出从上一层推出来的最小值f[i][j]=min(f[i-1][j],f[i-1][j-1])+a[i][j];f[i][1]=min(f[i-1][1],f[i-1][i-1])+a[i][1];//特殊边界点处理f[i][i]=min(f[i-1][i-1],f[i-1][1])+a[i][i];//特殊边界点处理//同一层更新最优解for(int k=i-1;k>0;k--)//从右往左推 从右往左走的情况更新f[i][k]=min(f[i][k],f[i][k+1]+a[i][k]);f[i][i]=min(f[i][i],f[i][1]+a[i][i]);for(int l=2;l<=i;l++)//从左往右推 从左往右走的情况更新f[i][l]=min(f[i][l],f[i][l-1]+a[i][l]);f[i][1]=min(f[i][1],f[i][i]+a[i][1]);for(int k=i-1;k>0;k--)//再推一遍从右往左推 从右往左走的情况更新f[i][k]=min(f[i][k],f[i][k+1]+a[i][k]);f[i][i]=min(f[i][i],f[i][1]+a[i][i]);for(int l=2;l<=i;l++)//再推一遍从左往右推 从左往右走的情况更新f[i][l]=min(f[i][l],f[i][l-1]+a[i][l]);f[i][1]=min(f[i][1],f[i][i]+a[i][1]);}cout<<f[n][1]<<endl;
}

转载于:https://www.cnblogs.com/OIerLYF/p/7260700.html

[DP][vijos1006]晴天小猪历险记之Hill相关推荐

  1. 18.03.06 vijos1006 晴天小猪历险记之Hill

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  2. vijosP1006 晴天小猪历险记之Hill

    vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...

  3. 晴天小猪历险记之Hill

    题目描述 这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在.但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求 ...

  4. voj1006 晴天小猪历险记之Hill

    背景 Background   在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种 ...

  5. vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化

    题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...

  6. 【vijos】1006 晴天小猪历险记之Hill(dijkstra)

    https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...

  7. P1006晴天小猪历险记之Hill

    背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...

  8. 晴天小猪历险记之Hill解题报告

    和数字三角形类似,但要更复杂一些. 一开始就仿照数字三角形写了方程:f[i][j]=min{f[i+1][j],f[i+1][j+1],f[i][j-1],f[i][j+1]},后来代码实现的时候发现 ...

  9. 回档|晴天小猪历险记之hill

    背景 Background 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物 ...

最新文章

  1. c语言中的extern_7.6 C语言内部函数和外部函数
  2. 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)
  3. NameServer的总控逻辑
  4. 数据中心UPS电源节能降耗的四大原则
  5. CodeForces - 1220D Alex and Julian(思维+数论)
  6. AE 模板 天使之城
  7. fluidity详解
  8. BugkuCTF-MISC题隐写
  9. INSTALLSHIELD11.5中打包水晶报表的问题,ScriptProject与ScriiptMSIProject差异引起的错误!...
  10. zabbix详解(十六)——zabbix agent自动注册实战
  11. DNS协议及Bind应用
  12. 概率论与数理统计---------分布函数
  13. Java中引用数据类型有哪些,它们与基本数据类型有什么区别?
  14. 不是计算机专业的,可以转行学IT吗?
  15. 运放TL08系列,功放LM386,8欧姆的扬声器
  16. 腾讯广点通广告投放-Web转化数据API自归因文档对接
  17. win10无法进入系统:无法加载操作系统,原因是关键系统驱动驱动程序丢失或包含错误
  18. Siemens TIA14 安装问题汇总
  19. 光耦,磁耦,容耦的区别
  20. IE浏览器下载文件名乱码

热门文章

  1. Nextracker冲刺美股:拟募资5亿美元 下周纳斯达克上市
  2. C++的ftok函数用法
  3. autohotkey设置最小化窗口的快捷键
  4. 君临天下用计算机怎么弹,君临天下!电脑版教程和按键设置
  5. 深圳行十一:香港自由行
  6. 大数据量时使用xloadtree2做分级加载的问题讨论
  7. JS动画的多种实现方式及原理
  8. qss 更改图标_qss 界面大全
  9. pdf怎么转换txt?转换渠道一览
  10. xftp连接ftp出现乱码问题