/*
NYoj 17 单调递增最长子序列
典型动态规划1.
*/
#include<iostream>
#include<memory.h>
#include<string.h>
#define max(a,b) a>b?a:b
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
char a[10002];
cin>>a;
int dp[10002],Max=0,len=strlen(a);
memset(dp,0,sizeof(dp));//同样这里的每一个字母都可以作为单调递增序列的第一个字母.
for(int i=0;i<len;i++) //但是此处赋值为1,处于时间复杂度的考虑,最后+1即可.
{
for(int j=i;j>=0;j--)
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+1);//do[i]为当前递增序列的最优解.
Max=max(Max,dp[i]);
}
cout<<Max+1<<endl;
}
}
HuNanOJ上有看见这道题。就又做了下。很是容易。
#include<cstdio>
#include<cstring>
#define Max(a,b) a>b?a:b
using namespace std;
const int N=1005;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[N],dp[N],max=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
for(int j=i;j>=0;j--)
if(a[i]>a[j]) dp[i]=Max(dp[i],dp[j])+1;
max=Max(dp[i],max);
}
printf("%d\n",max+1);
}
return 0;
}
后来,我就想时间复杂度的问题,很是郁闷N^2的复杂度,这时间上就太弱了。后来看了后来的那道题,有一个二分的方法。这种方法在时间相当的占优势。所以以后做类似的问题就不要用这种弱渣型的时间复杂度了。