码迷,mamicode.com
首页 > 其他好文 > 详细

【贪心】超级波浪数- 10045

时间:2014-10-25 22:45:15      阅读:399      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   strong   sp   

【贪心】超级波浪数- 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

标签:style   blog   color   io   os   ar   for   strong   sp   

原文地址:http://www.cnblogs.com/zoniony/p/4050928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!