博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT A1045 动态规划
阅读量:6279 次
发布时间:2019-06-22

本文共 929 字,大约阅读时间需要 3 分钟。

clipboard.png

该题目有两种解法,都是动态规划中特别经典的解法,一种是最长不下降子序列,一种是最长公共子序列;

第一种方法对于该题目其实有点取巧的感觉;

首先,注意一点,对于最长不下降子序列来说,其序列的元素一定是非递减的,所以我们的当务之急是如何将值转换为
递增序列,从而使得算法能够继续进行;
对于这个问题,我们可以使用hashtable进行处理,也就是利用hashtable重新使得值递增;

这里需要注意一下,子序列递增研究的是不连续的子序列,连续的子序列其实可以用前面的KMP算法来及进行解决;

对于该问题,首当其中的还是状态转移方程。由于该问题还是从0开始研究,所以仍然设置一个一维数组dp来储存中间的状态;

大致思路是限定一个子串序列,然后选择一个,从第一个开始进行轮询,这里有点像插入排序的感觉;

其状态转移方程为dp[i]=max(1,dp[j]+1);
该方程可以理解将第i个元素排在j后面,从而继承j之前的子串序列的长度,1为单个元素的序列长度;
代码如下:

#include
#include
#include
#include
using namespace std;const int maxc=210;const int maxn=10010;int Hashtable[maxc];int a[maxn],dp[maxn];int main(){ int n,m,x; scanf("%d%d",&n,&m); memset(Hashtable,-1,sizeof(Hashtable)); for(int i=0;i
=0){ a[num++]=Hashtable[x]; //进行hashtable的相应转换 } } int ans=-1; for(int i=0;i

第二种不太好理解,所以这里先不再赘述,主要是不能理解为什么公共部分可以重复输出;

转载地址:http://cnfva.baihongyu.com/

你可能感兴趣的文章
JAVA环境变量配置
查看>>
ASP.NET2.0组件控件开发视频 初体验
查看>>
工作经常使用的SQL整理,实战篇(三)
查看>>
MySQL性能、监控与灾难恢复
查看>>
Eclipse远程调试hadoop源码
查看>>
字符串反转
查看>>
SqlServer索引的原理与应用
查看>>
How To: Perl TCP / UDP Socket Programming using IO::Socket::INET
查看>>
Linux命令学习-sed
查看>>
第23章 访问者模式(Visitor Pattern)
查看>>
第21章 策略模式(Strategy Pattern)
查看>>
Python基础(7)--函数
查看>>
用jQuery.ajaxWebService请求WebMethod,Ajax处理实现局部刷新;及Jquery传参数,并跳转页面 用post传过长参数...
查看>>
PHP虚拟主机的配置
查看>>
C语言函数调用栈(二)
查看>>
HTTP Keep-Alive详解
查看>>
Data URI scheme - 数据的uri模式
查看>>
搜索引擎原理
查看>>
java良好的编码习惯
查看>>
利用JasperReport+iReport进行Web报表开发
查看>>