简单dp hdu-4105-Electric wave
题目链接:
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的更多相关文章
- HDU 1087 简单dp,求递增子序列使和最大
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 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 ...
- HDU 5375 Gray code (简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 2084 数塔(简单dp)
题目 简单dp //简单的dp #include<stdio.h> #include<string.h> #include<algorithm> using nam ...
- hdu1087 简单DP
I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB ...
- 4.15 每周作业 —— 简单DP
免费馅饼 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissi ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- 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 ...
- 简单dp --- HDU1248寒冰王座
题目链接 这道题也是简单dp里面的一种经典类型,递推式就是dp[i] = min(dp[i-150], dp[i-200], dp[i-350]) 代码如下: #include<iostream ...
- poj2385 简单DP
J - 简单dp Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:65536KB 64bit ...
随机推荐
- Ext中窗体第二次点击报错或者其内控件不显示的问题,弄了2天才解决,记录下
registerPanel.js: registerPanel = new Ext.form.FormPanel({ id:'registerPanel', layout:'form', autoHe ...
- ubuntu14.04 + cocos2d-x-2.2.6 + eclipse发布android + Qt Creator4
先把需要的东西准备好,打开控制台,执行以下语句: sudo apt--jdk lib32z1 lib32ncurses5 lib32bz2- 接下来,准备好cocos2d-x-2.2.6和 andro ...
- pyqt lineedit右边显示按钮效果
from PyQt4 import QtGui, QtCore class ButtonLineEdit(QtGui.QLineEdit): buttonClicked = QtCore.pyqtSi ...
- PhoneGap 和 PhoneGap Build 是什么?
PhoneGap是目前唯一支持7种平台的开源移动开发框架,支持的平台包括iOS.Android.BlackBerry OS.Palm WebOS.Windows Phone 7.Symbian和Bad ...
- 在sae配置django项目
1:使用sae开发必须有sae帐号,自己注册吧: 2:在sae上新建立一个python项目: 3:建立完成之后新建一个版本,即版本1: 4:获取svn的地址在eclipse中check下来: 5:注意 ...
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类
前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...
- openssl 证书请求和自签名命令req详解
1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水.我们以申请证书的流程说 ...
- Action重定向总结
[HttpPost] public ActionResult StudentList( string StudName, string studName, DateTime BirthDay, For ...
- FpSpread添加表头(列名)标注
for (int j = 0; j < fp.ActiveSheetView.ColumnCount; j++) { fp.ActiveSheetView.ColumnHeader.Cells[ ...
- eclipse 连接手机的 核心解决办法
重启adb的方法 根本不是最本质的方法 最本质的问题 ,一句话概括 : 没安装好驱动呗! 下面是转载的 android开发一般用到的开发工具就是eclipe,而安卓手机则用来调试程序.一般新手在建立 ...