题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4105

题目意思:

给一个字符串,求最大的分隔空格数,记所有被分隔的数为a1,a2,a3,.....

使得 a1<a2>a3<a4>a5.....

解题思路:

简单的dp;

记dp[0][i][j]表示从第i个字符开始到结束,且以第i~j个字符组成的数作为谷值的最大的分隔的数。

记dp[1][i][j]                          。。。                                                                   峰数....

则dp[0][i][j]=max(dp[0][i][j],dp[1][j+1][k]+1) // 其中(j+1~k)组成的数的值大于(i~j)组成的数。

dp[1][i][j]=max(dp[1][i][j],dp[0][j+1][k]+1) // 其中(j+1~k)组成的数的值小于(i~j)组成的数。

注意:

1、有前置0,比较的时候消除前置0.

2、比较的时候用strcmp和strncpy超时,直接一位一位的比。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ int dp[2][110][110]; //dp[0][i][j]表示从第i个字符开始长度为j的作为低谷时能分隔的最多数的个数
char save[110];
char temp1[110],temp2[110]; bool ismin(int i,int j,int k,int p)
{
while(save[i]=='0')
i++;
while(save[k]=='0')
k++;
if(k>p)
return false;
if(i>j)
return true;
if(j-i<p-k)
return true;
else if(j-i>p-k)
return false;
else
{
for(int pp=0;pp<=j-i;pp++)
if(save[pp+i]<save[pp+k])
return true;
else if(save[pp+i]>save[pp+k])
return false;
}
return false;
}
bool Ismin(char * a,char * b) //用这里的函数,居然超时
{
int len1=strlen(a),len2=strlen(b);
int i=0,j=0; while(a[i]=='0')
i++;
while(a[j]=='0')
j++;
if(j>=len2)
return false;
if(i>=len1)
return true;
if(len1-i<len2-j)
return true;
else if(len1-i>len2-j)
return false;
else
{
if(strcmp(a+i,b+i)<0)
return true;
else
return false;
}
}
int main()
{
int n; while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
scanf("%s",save+1);
for(int i=1;i<=n;i++) //初始化
{
dp[0][i][n]=1;
dp[1][i][n]=1;
} for(int i=n-1;i>=1;i--) //计算 dp[][i][j]
{
for(int j=i;j<n;j++)
{
//strncpy(temp1,save+i,j-i+1);
// temp1[j-i+1]='\0';
int k=j+1;
for(int p=k;p<=n;p++)
{
//strncpy(temp2,save+k,p-k+1);
//temp2[p-k+1]='\0';
// printf("2:%s\n",temp2);
if(ismin(k,p,i,j)) //后面的小,说明当前可以作为峰值
dp[1][i][j]=max(dp[1][i][j],dp[0][k][p]+1);
else if(ismin(i,j,k,p)) //后面的大,说明当前可以作为谷值
dp[0][i][j]=max(dp[0][i][j],dp[1][k][p]+1);
}
//printf("i:%d j:%d %d %d\n",i,j,dp[0][i][j],dp[1][i][j]);
}
}
int ans=0; //找到分隔多的数的个数
for(int i=1;i<=n;i++)
ans=max(ans,dp[0][1][i]);
printf("%d\n",ans-1); //隔板为分隔的数个数-1 }
return 0;
}

简单dp hdu-4105-Electric wave的更多相关文章

  1. HDU 1087 简单dp,求递增子序列使和最大

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. hdu 2471 简单DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 简单dp, dp[n][m] +=(  dp[n-1][m],dp[n][m-1],d[i][k ...

  3. HDU 5375 Gray code (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...

  4. hdu 2084 数塔(简单dp)

    题目 简单dp //简单的dp #include<stdio.h> #include<string.h> #include<algorithm> using nam ...

  5. hdu1087 简单DP

    I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     ...

  6. 4.15 每周作业 —— 简单DP

    免费馅饼 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  7. Codeforces Round #260 (Div. 1) A. Boredom (简单dp)

    题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...

  8. codeforces Gym 100500H A. Potion of Immortality 简单DP

    Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...

  9. 简单dp --- HDU1248寒冰王座

    题目链接 这道题也是简单dp里面的一种经典类型,递推式就是dp[i] = min(dp[i-150], dp[i-200], dp[i-350]) 代码如下: #include<iostream ...

  10. poj2385 简单DP

    J - 简单dp Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit ...

随机推荐

  1. 好多邮箱的SMTP设置

    http://731771490.diandian.com/post/2011-04-20/19576550

  2. jQuery 之$.proxy() 方法

    定义和用法 $.proxy 方法接受一个已有的函数,并返回一个带特定上下文的新的函数. 该方法通常用于向上下文指向不同对象的元素添加事件. 参数 描述 function 要被调用的已有的函数. con ...

  3. crtmpserver通常使用基本类演示

    以前我们做了分析过程,这一次,我们都参与了类做梳子,两个可以一起关注一下一起合并,整个方案的实施是有帮助. BaseClientApplication APP基类,一切APP都基于这个类 Stream ...

  4. LoadRunner测试下载功能点脚本(方法二)

    在上一篇<LoadRunner下载功能点脚本(方法一)>中,实现的脚本仅是录制下载功能点的脚本,现在性能需求的场景更改如下: 性能需求:对系统某页面中,点击下载并将下载文件保存到本地电脑的 ...

  5. samba错误

    1.session setup failed: NT_STATUS_LOGON_FAILURE 该错误表示用户有误, 可能是用户不存在, 也有可能是密码错误, 或者用户只是在samba和系统的用户中的 ...

  6. 理清fineuploader无刷新上传的一些事

    1.fineuploader是一款不依赖与jquery的异步无刷新上传组件,fineuploader采用ajax方式实现对文件上传,返回值都是以json的格式,对后台服务器操作和前端dom对象一些操作 ...

  7. 设置单选的listView或者gridview

    主要是这个BeaseAdapter的方法notifyDataSetChanged()的使用;作用 :调用BaseAdapter中的getView();方法,刷新ListView中的数据.实现:1.在B ...

  8. 将16进制(HTML)颜色值转换成 Color类型

    private void btnChangeColor_Click(object sender, EventArgs e) { txtColor.BackColor = ColorTranslator ...

  9. VPN错误789:L2TP连接尝试失败

    VPN 错误789:l2tp 连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误 Windows配置VPN,选择“使用IPsec的第2层隧道协议(L2TP/IPSec)”时, XP系 ...

  10. windows新的数据类型

    1.简单重定义的 如LPCSTR只字符串,只是名字不同 2.句柄类型 H开头的句柄 3.结构体类型 如对话框 4.重新更名一方面为了32位->64位升级时带来的麻烦 typedef unsign ...