【贪心】超级波浪数- 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 }
时间: 2024-10-26 15:00:32