poj 2533 动态规划 最长子序列

来源:互联网 发布:js如何给div赋id 编辑:程序博客网 时间:2024/06/13 11:10
#include<iostream>#include<cstring>using namespace std;int num[1010],d[1010];int DP(int i){int max=0,j;if(d[i]==0){for( j=0;j<i;j++){if(num[j]<num[i]){if(max<DP(j))max=DP(j);}}d[i]=1+max;}return d[i];}int main(){int n,max=0;int i;cin>>n;memset(d,0,sizeof(d));for( i=0;i<n;i++)cin>>num[i];for(i=0;i<n;i++){if(max<DP(i))max=DP(i);}cout<<max<<endl;return 0;}
求最长满足要求的子序列是动态规划的典型例题,重点在于dp[i]的含义,他表示必须以第i个元素结尾的递增的最长子序列的长度,然后对i之前的元素循环,表示倒数第二个元素必须是num[j],递增则等于dp[j]+1,否则dp[i]=1;最后求出dp的值,比较找出最大的。
<pre name="code" class="cpp">#include<iostream>using namespace std;int main(){int n,num[1010],i,j,dp[1010],temp,max,max1;cin>>n;for(i=1;i<=n;i++)cin>>num[i];dp[1]=1;for(i=2;i<=n;i++){max=-1;for(j=1;j<i;j++){if(num[i]>num[j])temp=dp[j]+1;elsetemp=1;if(max<temp)max=temp;}dp[i]=max;}max1=dp[1];for(i=1;i<=n;i++){if(max1<dp[i])max1=dp[i];}cout<<max1<<endl;return 0;}



0 0
原创粉丝点击