对于最简单DP问题,比如7 9 1 10 3中最长的递增字符串就是7 9 10,所以长度是3.
对于这个问题,就是从第二个开始,让后面的每一个字符都假设作为咱们要找的最长的字符串的最后一个字符,然后从第一个字符开始和找,这样逐渐找就能找到最长的^…^
状态转移方程为
状态转移方程 DP[ i ] = max { 1 ,max(DP[ 0 ] ...DP[ k ]... DP[ i-1 ]) +1 |A[ k ] < A[ i ] }
具体解释见代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int ss[1005];//存储字符 9 int sslen[1005];//存储每一个到当前字符所形成的最长递增字符串的长度 10 int n,maxx,maxlen; 11 while(cin>>n){ 12 maxlen=1;//记录最长的字符串的长度 13 memset (ss,0,sizeof(ss)); 14 for(int i=1;i<=n;i++) 15 cin>>ss[i]; 16 for(int k=1;k<=n;k++) 17 sslen[k]=1;//初始化数组 18 for(int i=2;i<=n;i++){ 19 maxx=0;//记录到当前字符的最长的递增个数 20 for(int j=1;j<=i-1;j++){ 21 if(ss[j]<ss[i]&&sslen[j]>maxx){ 22 maxx=sslen[j]; 23 } 24 } 25 sslen[i]=maxx+1; 26 if(sslen[i]>maxlen) 27 maxlen=sslen[i]; 28 } 29 cout<<maxlen<<endl; 30 } 31 }
时间: 2024-10-04 20:28:40