1239 Increasing Sequences

原创 2007年10月15日 08:28:00
Increasing Sequences
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 482   Accepted: 162

Description
Given a string of digits, insert commas to create a sequence of strictly increasing numbers so as to minimize the magnitude of the last number. For this problem, leading zeros are allowed in front of a number.

Input
Input will consist of multiple test cases. Each case will consist of one line, containing a string of digits of maximum length 80. A line consisting of a single 0 terminates input.

Output
For each instance, output the comma separated strictly increasing sequence, with no spaces between commas or numbers. If there are several such sequences, pick the one which has the largest first value;if there's a tie, the largest second number, etc.

Sample Input

 

Sample Output

 

Source
East Central North America 2002

 

**************************************************************************************

************************************************************************************9**

Source Code
#include <stdio.h>
#include <string.h>
#define N_MAX 81
char seqStr[N_MAX];
char d[N_MAX][N_MAX];
char res[N_MAX],resTemp[N_MAX];
int num;
bool Great(int start1,int len1,int start2,int len2)
{
 while(len1 > 0 && seqStr[start1] == '0')
 {
  len1--;
  start1++;
 }
 while(len2 > 0 && seqStr[start2] == '0')
 {
  len2--;
  start2++;
 }
 if(len1 > len2)
  return true;
 else if(len1 == len2)
 {
  while(len1 > 0)
  {
   if(seqStr[start1] > seqStr[start2])
    return true;
   else if(seqStr[start1] < seqStr[start2])
    return false;
   else
   {
    start1++;
    start2++;
    len1--;
   }
  }
  return false;
 }
 else
  return false;
}
void GetResult(int idx,int len,int numTemp)
{
 int i,j;
 if(idx == len)
 {
  if(num == 0)
  {
   resTemp[numTemp] = len;
   num = numTemp + 1;
   memcpy(res,resTemp,num);
  }
  else
  {
   bool best = false;
   resTemp[numTemp] = len;
   for(i = numTemp,j = num - 1 ; i >= 0 && j >= 0 ; i--,j--)
   {
    if(resTemp[i] > res[j])
     best = true;
    if(resTemp[i] == res[j])
     continue;
    break;
   }
   if(best == true)
   {
    num = numTemp + 1;
    memcpy(res,resTemp,num);
   }
  }
 }
 else
 {
  resTemp[numTemp] = len;
  for(i = 1 ; i <= d[idx][len] ; i++)
  {
   if(d[idx-len][i] == 0)
    continue;
   GetResult(idx-len,i,numTemp+1);
  }
 }
}
void DP()
{
 int i,j,t,prev;
 bool bGreat;
 int len = strlen(seqStr + 1) + 1;
 d[1][1] = 1;
 for(i = 2 ; i < len ; i++)
 {
  d[i][i] = 1;
  for(j = 1 ; j < i ; j++)
  {
   prev = i - j;
   t = j;
   while(t < prev && seqStr[prev - t] == '0')
    t++;
   for( ; t > 0 ; t--)
   {
    if(d[prev][t] == 0)
     continue;
    
    if(Great(i - j + 1,j,prev - t + 1,t))
    {
     bGreat = true;
     break;
    }
   }
   if(bGreat == true)
    d[i][j] = t;
   else
    d[i][j] = 0;
  }
 }
 prev = len - 1;
 for(i = 1 ; i < len ; i++)
 {
  if(d[prev][i] > 0)
   break;
 }
 j = i;
 while(j < len && seqStr[prev - j] == '0')
  j++;
 num = 0;
 for( ; i <= j ; i++)
  GetResult(prev,i,0);
 prev = 1;
 for(i = num - 1 ; i > 0 ; i--)
 {
  j = prev + res[i];
  for( ; prev < j ; prev++)
   printf("%c",seqStr[prev]);
  printf(",");
 }
 j = prev + res[i];
 for( ; prev < j ; prev++)
  printf("%c",seqStr[prev]);
 printf("/n");
}
int main() 
{
 //freopen("test.txt","r",stdin);
 while(scanf("%s",seqStr + 1) != EOF)
 {
  if(strlen(seqStr + 1) == 1 && seqStr[1] == '0')
   break;
  DP();
 }
    return 0;
}
3,4,5,6
35,46
3,5,26
0001
100,000101
3456
3546
3526
0001
100000101
0

[51nod1239]欧拉函数之和

Description求∑i=1nφ(i)\sum_{i=1}^{n}\varphi(i) n
  • alan_cty
  • alan_cty
  • 2016年07月06日 10:37
  • 1451

高并发数据结构Disruptor解析(3)

ProducerMultiProducerSequencer下面是多生产者核心类MultiProducerSequencer的类继承关系,与之前讲的SingleProducerSequencer相似:...
  • zhxdick
  • zhxdick
  • 2016年07月27日 11:15
  • 2896

阿里云主机开启swap分区

由于开启swap分区会导致硬盘IO性能下降,因此阿里云服务器初始状态未配置swap,如果某些应用需要开启swap分区,可以采用如下方法增加:1、创建用于交换分区的文件dd if=/dev/zero o...
  • jom_ch
  • jom_ch
  • 2015年05月26日 17:31
  • 2048

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

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

两次dp-poj-1239-Increasing Sequences

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

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
  • 1406

poj 1239 Increasing Sequences

题目链接:http://poj.org/problem?id=1239 题目大意:求使最后一个数最大且前面的数尽量大的加逗号方式,两次dp,先从前到后求得最后一个数,然后反向dp,求出满足条件且当前...
  • Wings_of_Liberty
  • Wings_of_Liberty
  • 2012年03月25日 21:49
  • 639

hdu Increasing Sequences

/* Problem: hdu Increasing Sequences (1424) Lang: C++ 题意: 给一串数字串给你分割,求分割后(按照递增规律...
  • cj594618504
  • cj594618504
  • 2012年04月12日 15:08
  • 531

zoj 1499 Increasing Sequences

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

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

E - Consecutively Increasing Sequences Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/6...
  • better_life30
  • better_life30
  • 2014年08月14日 09:36
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1239 Increasing Sequences
举报原因:
原因补充:

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