【dp】poj 2533最长上升子序列

本题的思路:

用数组a[]来存输入的数据,用数组b[i]来存到a[i]最长子序列的长度。

通过状态转移方程max=max{b[x1],b[x2]........b[xi]};并且有(0<=xi<i;a[xi]<a[i]),则可以得到a[i]之前的数所组成的最长子序列了,

切b[i]=max+1;

AC代码如下:

 

 
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<cstdlib> #include<queue> #define MAXN 1005 #define LL long long int using namespace std; int a[MAXN]; int b[MAXN]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ cin>>a[i]; b[i]=1;//每个数据自身可构成一个长度为一的串 } int max; for(int i=1;i<n;i++){//循环控制用来寻找以位置i结束的最长子串 max=0;//用来记录寻早到的位置i以前的最长子串的长度 for(int j=0;j<i;j++){//表示以位置j结束时并且满足转移方程是的子串长度 if(a[j]<a[i]&&b[j]>max){//筛选出最长子串 max=b[j]; } } b[i]=max+1;//加上自身的长度就为以位置i结束的最长子串 } max=0; for(int i=0;i<n;i++){ if(max<b[i]) max=b[i]; } cout<<max<<endl; } return 0; } 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值