poj 1239 Increasing Sequences

原创 2012年03月25日 21:49:58

题目链接:http://poj.org/problem?id=1239

题目大意:求使最后一个数最大且前面的数尽量大的加逗号方式,两次dp,先从前到后求得最后一个数,然后反向dp,求出满足条件且当前数最大的方案。需要注意的是最后一段可加0.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
	return a>b?a:b;
}
int min(int a,int b)
{
	return a<b?a:b;
}
int dp[100];
char str[100];
char s1,s2;
int len;
bool cmp(int st1,int ed1 ,int st2,int ed2)
{
    int i,j;
    //int tmp;
    for(i=st1;str[i]=='0'&&i<ed2;i++){}
    st1=i;
    for(i=st2;str[i]=='0'&&i<ed2;i++){}
    st2=i;
    if(ed1-st1<ed2-st2)
        return true;
    else if(ed1-st1>ed2-st2)
        return false;
    for(i=0;i+st1<=ed1;i++)
    {
        if(str[i+st1]<str[i+st2])
            return true;
        else if(str[i+st1]>str[i+st2])
            return false;
    }
    return false;

}
int main()
{
    int i,j;
    while(scanf("%s",str)!=EOF)
    {
        len=strlen(str);
        if(str[0]=='0'&&len==1)
            break;
        dp[0]=0;
        for(i=1;i<len;i++)
        {
            //dp[i]=i;
            dp[i]=0;
            for(j=i-1;j>=0;j--)
            {
                if(cmp(dp[j],j,j+1,i))
                {
                    dp[i]=j+1;
                  //  printf("i %d dp %d\n",i,dp[i]);
                    break;
                }
            }
        }
        int last=dp[len-1];
        dp[last]=len-1;
        for(i=last-1;i>=0;i--)
        {
            dp[i]=-1;
            if(str[i]=='0')
            {
                dp[i]=dp[i+1];
                continue;
            }
            for(j=last;j>=i+1;j--)
            {
                if(cmp(i,j-1,j,dp[j]))
                {
                    dp[i]=j-1;
                 //   printf("i %d %d\n",i,dp[i]);
                    break;
                }
            }
        }
        int tmp=dp[0];
        i=0;
       while(1)
       {
            while(i<=tmp)
            {
                printf("%c",str[i]);
                i++;
            }
            if(tmp==len-1)
                break;
            printf(",");
            tmp=dp[tmp+1];
        }
        puts("");
    }
}


 

相关文章推荐

POJ 1239-Increasing Sequences(LIS 分割成上升序列-两次DP)

Increasing Sequences Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...
  • MIKASA3
  • MIKASA3
  • 2016年05月21日 13:10
  • 594

两次dp-poj-1239-Increasing Sequences

题目链接: http://poj.org/problem?id=1239 题目大意: 给一个数字串(不超过80位),可以在数字之间添加逗号,分成几个数,要求最后形成一个严格递增的序列,且要求最后一个...

ZOJ1499 POJ1239 HDU1511 Increasing Sequences

非常经典的DP题!必须要好好研究! 需要两次dp,第一次dp正向,dp[i]的值x表示的是到了i,i前面的x个字符(包含i)组成数值后,前i个字符符合上升队列,且x为最大。则我们可以知道前i-dp[...
  • neofung
  • neofung
  • 2012年04月06日 19:51
  • 1369

(数学,大数运算)Consecutively Increasing Sequences_ACdream原创群赛(17)のacmer never retire

E - Consecutively Increasing Sequences Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/6...

hdu Increasing Sequences

/* Problem: hdu Increasing Sequences (1424) Lang: C++ 题意: 给一串数字串给你分割,求分割后(按照递增规律...

zoj 1499 Increasing Sequences

都说经典dp,但是居然没有反应过来。dp方式和最长递增子串这种问题类似:从首位开始长度为n的子串,假设可以获得的最小的最后位数字为f(n)。那么f(n)可以通过比n小的子串得到。具体就不说了 然后这...

POJ-1411 & HDOJ-1239 Calling Extraterrestrial Intelligence Again 解题报告

筛素数并且需要优化技巧的题,当然暴力貌似也能过,不推荐暴力。题意:很简单,给你三个正整数m,a,b(其中4 1 )。现在让你找到两个素数p和q,使得pq        我的解题思路:如...
  • JZQT_T
  • JZQT_T
  • 2015年01月20日 11:00
  • 513

poj1239(两次Dp)

两次dp求解,题目要求在整个是递增子序列的前提下最后一个元素的值要最小,并且在此前提下第一个的值要最大,不看题解根本想不到怎么做。 做法:定义两个dp数组dp_min dp_max  第一个记录某个i...

poj 1239

参照http://blog.csdn.net/a342374071/article/details/6689232 题目大意就是给定一些数字串,要你分别对每个数字串用逗号隔开,这样每个数字串中的数字...

poj1776 Task Sequences--竞赛图下的哈密顿通路+入门

原题链接:http://poj.org/problem?id=1776 题意:n个任务,一个n*n的数组,(i,j)该位置是1表示做了i任务机器直接做j,如果是0,机器做完i,机器就会关闭,...
  • LaoJiu_
  • LaoJiu_
  • 2016年11月13日 09:41
  • 774
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1239 Increasing Sequences
举报原因:
原因补充:

(最多只允许输入30个字)