动态规划学习之最长上升子序列
来源:互联网 发布:淘宝店铺售假扣24分 编辑:程序博客网 时间:2024/05/21 14:05
这个问题的关键是建立状态方程dp[i],保存算法a[i]为终点的最长上升子序列的长度,那么dp[i]的解题思路就是从前面找到比a[i]小,并且具有最大dp[j](0<=j<=i-1)的j,并且在后面接上的a[i].因此方程为 dp[i] = dp[j]+1(0<=j<=i-1&&max(dp[j]))。除此之外,因为都是从比i小的dp[j]开始运算,因此当第一个数的时候前面没有值,所以需要手动判断初始化dp[0]=1,从第二个开始计算。
#include<iostream>#include<string.h>using namespace std;int main(){int n;cin>>n;int a[n];for(int i=0;i<n;i++) cin>>a[i];int dp[n]; //状态数组,表示以当前i为结束的序列的最长的上升子序列的长度 memset(dp,0,n*sizeof(int));//思路是dp[i]对dp[0..i-1]遍历,当a[0..i-1]<a[i]并且dp[0..i-1]+1>dp[i],这里dp[i]不断改变,最终得到的是使dp[i]最大的dp[0..i-1]if(n>=1) dp[0] = 1;for(int i = 1;i<n;i++) for(int j=0;j<i;j++) { if(a[i]>a[j]&&dp[j]+1>dp[i]) dp[i] = dp[j]+1; }int count = 0; for(int i = 0;i<n;i++) { if(dp[i]>count) count = dp[i]; //cout<<dp[i]<<endl; } cout<<count<<endl; }
0 0
- 动态规划学习之最长上升子序列
- 算法学习之动态规划--最长上升子序列
- 动态规划之最长上升子序列
- 【动态规划】 之 最长上升子序列
- poj 1836 (动态规划之最长上升子序列)
- 动态规划(DP)之最长上升子序列
- 动态规划(DP)之最长上升子序列问题
- 简单动态规划之最长上升子序列
- 经典动态规划之最长上升子序列
- C++动态规划算法之最长上升子序列
- 动态规划专题之最长上升子序列
- 动态规划:最长上升子序列
- 动态规划-最长上升子序列LIS
- 动态规划求最长上升子序列
- 【算法】动态规划 最长上升子序列
- 动态规划:最长上升子序列
- poj2533 动态规划+最长上升子序列
- POJ2533 动态规划 (最长上升子序列)
- DDSM数据库在windows环境下的转换
- oracle创建表空间
- iOS蓝牙Service定义对照表
- Linux学习(1):ls命令
- 【Android】新版Android Studio 2.0 Preview 4 下载链接 百度网盘
- 动态规划学习之最长上升子序列
- 得到一个字符串的哈希Hash值
- could not find java SE Runtime Environment/Error: could not find java.dll
- Matching Game based on JS
- 在Windows上调优DB2
- 窗口看门狗的真正作用
- Android studio中cannot reload avd list问题解决
- 【转载】大力推荐使用chrome浏览器
- 使用AFNetworking时遇到了 property synthesis 相关的 error