二次dp,还算好想。

先第一遍dp找出最后一个数字最小是几。

dpf[i]=max{j}+1(dpf[j],dpf[j]+1,…,j位组成的数字小于j+1,j+2,…,i位组成的数字。

在第二遍dp,找出第一个数字最大是几。

dpb[i]=max{j}(I,i+1,…,j为组成的数字小于j+1,j+2,…,dpb[i+2]位组成的数字。

按轨迹输出。

!记住:每次都要将两个数组清零!(坑了我半天)

代码:

#include<cstdio>

#include<cstring>

using namespace std;

int dpf[90]={0},dpb[90]={0};

char a[90];

int max(int x,int y){

return(x>y)?x:y;

}

int cmp(int x1,int y1,int x2,int y2){

while(a[x1]=='0' && x1<=y1)x1++;

while(a[x2]=='0' && x2<=y2)x2++;

if(x1>y1 && x2>y2)return 1;

if(y1-x1>y2-x2)return 0;

if(y1-x1<y2-x2)return 1;

for(int i=0;i<=y1-x1;i++){

if(a[x2+i]>a[x1+i])return 1;

if(a[x1+i]>a[x2+i])return 0;

}

return 0;

}

int main(){

scanf("%s",a);

while(strlen(a)!=1 || a[0]!='0'){

int l=strlen(a);

dpf[0]=0;

for(int i=1;i<l;i++){

dpf[i]=0;

for(int j=0;j<i;j++)

if(j+1>dpf[i] && cmp(dpf[j],j,j+1,i))

dpf[i]=j+1;

}

//               for(int i=0;i<l;i++)printf("%d ",dpf[i]);printf("\n");

int tl=dpf[l-1];

memset(dpb,0,sizeof(dpb));

dpb[tl]=l-1;

for(int i=tl-1;a[i]=='0';i--)

dpb[i]=l-1;

for(int i=tl-1;i>=0;i--){

for(int j=i;j<=tl-1;j++){

if(cmp(i,j,j+1,dpb[j+1]))

dpb[i] = max(dpb[i], j);

}

}

//               for(int i=0;i<l;i++)printf("%d ",dpb[i]);printf("\n");

int cur=dpb[0];

for(int i=0;i<l;){

for(;i<=cur && i<l;i++)printf("%c",a[i]);

if(i<l)printf(",");

cur=dpb[cur+1];

}

printf("\n");

scanf("%s",a);

}

return 0;

}

poj 1239的更多相关文章

  1. POJ 1239 Increasing Sequences 动态规划

    题目链接: http://poj.org/problem?id=1239 Increasing Sequences Time Limit: 1000MSMemory Limit: 10000K 问题描 ...

  2. POJ 1239 Increasing Sequences(经典的两次dp)

    http://poj.org/problem?id=1239 题意:给出一串序列,现在要添加逗号作为分隔符,使得序列是递增序列,然后让最后一个数尽量小,第一个数尽量大. 思路:先从头到尾进行一次dp, ...

  3. POJ 1239 Increasing Sequences [DP]

    题意:略. 思路:进行两次dp. 第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求.最后求的dp[n]即为最后一个数字的长度. 而题目还有要求,所 ...

  4. 【转载】ACM总结——dp专辑

    感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一 ...

  5. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  6. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  7. 【DP专辑】ACM动态规划总结(转)

    http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...

  8. dp有哪些种类

    dp有哪些种类 一.总结 一句话总结: 二.dp动态规划分类详解 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...

  9. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

随机推荐

  1. 嵌入式Linux驱动学习之路(二十)USB设备驱动

    USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...

  2. Enum简单例子DropdownList

    借鉴:http://www.cnblogs.com/suizhikuo/archive/2013/06/07/3125225.html vs2012 mvc4 最终效果: 1.建立mvc4 Inter ...

  3. ReactJS基础视频教程

    React是什么?React.js 是 Facebook 推出的一个用来构建用户界面的 JavaScript 库.Facebook开源了React,这是该公司用于构建反应式图形界面的JavaScrip ...

  4. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  5. knockoutJS学习笔记07:绑定上下文

    所谓绑定上下文就是当前绑定(dat-bind)所使用到的对象(ViewModel).在单个对象绑定的情况下是很容易理解的,但对象可能是复杂的类型,嵌套很多层,这个时候每层都有自己的上下文对象,理解起来 ...

  6. docfx组件介绍--YamlSerialization

    在docfx中把元数据以yaml的形式保存,在metadata阶段会序列化数据到yaml文件中,在build阶段又需要从yaml文件反序列化出来.在使用过程中,意外发现yamldotnet在处理大量强 ...

  7. docfx daylybuild

    参考:https://myget.org/gallery/docfx-dev 根据对应的vs或nuget版本中添加地址. PS:daylybuild可能包含很多错误哦.

  8. Nhibernate Query By Criteria 条件查询

    HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictio ...

  9. 理解C# 4 dynamic(2) – ExpandoObject的使用

    ExpandoObject的使用非常简单,很容易入手.上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic ...

  10. linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题

    linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...