dp专题 第一题最长上升子序列
2017-04-05 11:14
169 查看
1、简单描述
给出一个序列,找出他最长上升子序列的长度
2、思路
#include <bits/stdc++.h>
using namespace std;
int b[1000];
int maxlen[1000];
int main()
{
int i,j,n;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>b[i];
} //输入原序列
maxlen[1]=1;
for(i=2;i<=n;i++)
{
int temp =0;
for(j=1;j<=i;j++)
{
if(b[i]>b[j])
{
if(temp<maxlen[j])
temp=maxlen[j];
}
}
maxlen[i]=temp+1; //缩小问题规模,解决子问题
}
int Max=-1;
for(i=1;i<=n;i++)
{
if(Max<maxlen[i])
Max=maxlen[i];
} //将最长上升子序列长度赋给max
cout<<Max<<endl;
return 0;
}
将问题转化为将第k个元素为最终元素时的最长上升子序列,子问题只与元素位置有关。
给出一个序列,找出他最长上升子序列的长度
2、思路
#include <bits/stdc++.h>
using namespace std;
int b[1000];
int maxlen[1000];
int main()
{
int i,j,n;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>b[i];
} //输入原序列
maxlen[1]=1;
for(i=2;i<=n;i++)
{
int temp =0;
for(j=1;j<=i;j++)
{
if(b[i]>b[j])
{
if(temp<maxlen[j])
temp=maxlen[j];
}
}
maxlen[i]=temp+1; //缩小问题规模,解决子问题
}
int Max=-1;
for(i=1;i<=n;i++)
{
if(Max<maxlen[i])
Max=maxlen[i];
} //将最长上升子序列长度赋给max
cout<<Max<<endl;
return 0;
}
将问题转化为将第k个元素为最终元素时的最长上升子序列,子问题只与元素位置有关。
相关文章推荐
- 动态规划之编号动态规划:hdu 1025(dp+二分 求最长上升子序列)
- YTU3135--最长上升子序列(dp)
- HDU 1069 Monkey and Banana (dp, 最长上升子序列)
- CODE[VS] 最长公共上升子序列(LCIS)(序列型DP)
- Bridging signals(线性DP-寻找最长上升子序列)
- poj1631 dp 最长上升子序列LIS
- 最长上升子序列(dp)
- hdu 1160 dp (二维最长上升子序列 记录路径
- NOJ 1135 Missile dp 最长上升子序列变形 双dp
- POJ 2533 Longest Ordered Subsequence(DP最长上升子序列O(n^2)&&O(nlogn))
- 简单的dp@POJ(3)2533 最长上升子序列
- 最长上升子序列nlogn通解(dp之线段树优化)
- HDU1087 Super Jumping! Jumping! Jumping!【最长上升子序列+DP】
- Vijos P1303 导弹拦截【最长上升子序列+DP】
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)
- 线性dp(最长上升子序列)
- (POJ1836)Alignment <DP,最长上升子序列变形>
- hdu 1087 Super Jumping! Jumping! Jumping!(dp 最长上升子序列和)
- C - Mysterious Present(DP求最长上升子序列)
- hdu 1160 dp (二维最长上升子序列 记录路径