求最大上升子序列问题
老师今天上课刚讲过的问题 。
用动态规划求解。
dp[0]=1;
dp[i]=max{dp[j](0<=j<i,j<i&&d[j]<d[i])};
#include<iostream>
using namespace std;
int d[10010];
int dp[10010];
int n;
void getdp(){
dp[0]=1;
for(int i=1;i<n;i++){
int max=0;
for(int j=0;j<i;j++){
if(d[j]<d[i]&&dp[j]>max)max=dp[j];
}
dp[i]=max+1;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>d[i];
}
getdp();
int max=-1;
for(int i=0;i<n;i++){
if(dp[i]>max)max=dp[i];
}
cout<<max<<endl;
}
刚才发现O(n^2)算法在poj3903会超时. 下面有
http://blog.csdn.net/lyy289065406/article/details/6648136 小優YoU 的(n*logn)算法。
代码不转了,去大神那里看吧~