首页 > 代码库 > 【贪心】超级波浪数- 10045

【贪心】超级波浪数- 10045

【贪心】超级波浪数- 10045

Time Limit: 1000MS
Memory Limit: 32768KB

波 浪数,数的大小关系就象波浪,如“14352”我们从左向右看时数的大小由小到大,然后到小,再到大,再到小,当然14253、14352、24153、 24351、34152、34251、212、121也是波浪数,但122不是波浪数,112,1221也不是波浪数,现在有一个很大的数,我们想从中选 一些数出来,组成一个波浪数,由于数很大,我们叫它超级波浪数。给定一个数,请从中选一个最长的超级波浪数。
输入:
第一行一个数(小于3000位)
输出:
一个数,最长的超级波浪数的长度。
样例:
输入
123251
输出
6

状态:F[i]表示到f[i]位的最大波浪数

状态转移方程{

If(num[i]==num[i-1])f[i]=f[i-1];如果和前面的数相同,那么波浪数不变

If(ok)f[i]=f[i-1]+1;如果位置的数是合法的,波浪数+1

If(!ok)如果不合法,波浪数不增加

}

边界f[1]=1;

 1 # include<stdio.h> 2 # include<cstring> 3 # include<iostream> 4 # include<algorithm> 5 using namespace std; 6 const int maxn=3000+10; 7 int a[maxn],b[maxn],dp[maxn]; 8 char num[maxn]; 9 int main(){10     scanf("%s",num+1);11     int n=strlen(num+1);12     for(int i=2;i<=n;i++)13     if(num[i]==num[i-1]){14         a[i]=a[i-1];15         b[i]=b[i-1];16     }17     else if(num[i]>num[i-1])a[i]=a[i-1]+1;18     else if(num[i]<num[i-1])b[i]=b[i-1]+1;19     dp[1]=1;20     for(int  i=2;i<=n;i++){21         if(num[i]==num[i-1])dp[i]=dp[i-1];22         else if(a[i]+b[i]==1)dp[i]=dp[i-1]+1;23         else if(a[i]+b[i]>1) dp[i]=dp[i-1];24     }25     printf("%d",dp[n]);26     return 0;27 }

 

【贪心】超级波浪数- 10045