题目来源:http://http://acm.nyist.net/JudgeOnline/problem.php?pid=17
单调递增最长子序列
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int d[10005];
int main()
{
int N;
scanf("%d",&N);
int i,j,Max;
char str[10005];
while(N--)
{
scanf("%s",str);
int len=strlen(str);
Max=0;
for(i=0;i<len;i++)
d[i]=1;
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++)
{
if(str[j]>str[i]&&d[j]<d[i]+1)
d[j]=d[i]+1;
}
}
for(i=0;i<len;i++)
{
if(Max<d[i])
Max=d[i];
}
printf("%d\n",Max);
}
return 0;
}
题目思想很简单。方法也有很多。这只是其中的一种,比较容易理解罢了
经典的DP问题。时间复杂度是O(n^2)求最长上升子序列的长度。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 10010
int main()
{
char str[N],a[N];
int i,j,len,T,count;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
count=1;
len=strlen(str);
a[0]=0;
for(i=0;i<len;i++)
{
for(j=count-1;j>=0;j--)
{
if(str[i]>a[j])
{
a[j+1]=str[i];
if(j+1==count)
count++;
break;
}
}
}
printf("%d\n",count-1);
}
return 0;
}