nyoj 單調遞增最長子序列(貪心||DP)


單調遞增最長子序列

描述
求一個字符串的最長遞增子序列的長度
如:dabdbf最長遞增子序列就是abdf,長度為4
輸入
第一行一個整數0<n<20,表示有n個字符串要處理
隨后的n行,每行有一個字符串,該字符串的長度不會超過10000
輸出
輸出字符串的最長遞增子序列的長度
樣例輸入
3
aaa
ababc
abklmncdefg
樣例輸出
1
3
7
方法一:
通過一個數組不斷地記錄遞增子序列的最大長度。代碼:
#include<stdio.h>
#include<string.h>
int dp[10010];
char a[10010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
int i,la,j,maxn=-1;
scanf("%s",a+1);
la=strlen(a+1);
for(i=1;i<=la;i++)
{
for(j=i-1;j>=0;j--)
{
if(a[j]<a[i]&&dp[i]<dp[j]+1)//判斷是否遞增,並且判斷當前元素所處遞增序列的長度
dp[i]=dp[j]+1;//更新遞增序列的最大長度
}
if(dp[i]>maxn)
maxn=dp[i];
}
printf("%d\n",maxn);
}
return 0;
}

方法二:
代碼:
#include<stdio.h>
#include<string.h>
char a[10010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,'\0',sizeof(a));
int i,la,j,tot=0;
scanf("%s",a);
la=strlen(a);
for(i=0; i<la; i++)
{
for(j=0; j<tot; j++)
{
if(a[j]>=a[i])//不斷地依次更新遞增子序列的較小值,以實現獲取較長的遞增子序列
{
a[j]=a[i];
break;
}
}
if(j==tot)//若出現一個大於當前最長遞增子序列最大值的元素,更新遞增子序列的長度,並更新遞增子序列的最大值
{
a[j]=a[i];
tot++;
}
}
printf("%d\n",tot);
}
return 0;
}
ps:不斷地從一個遞增子序列的最小元素開始更新此遞增子序列的元素,若此輪並沒有更新任何元素且j等於tot,說明又出現一個最大元素,此時應更新此遞增子序列的長度,最后找到字符串中最長的遞增子序列,

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com