动态规划学习之最长上升子序列

来源:互联网 发布:淘宝店铺售假扣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
原创粉丝点击