poj 1093 Formatting Text

原创 2012年03月21日 15:18:35

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

题目大意:将一段文字重新排版,每行有n个字符,问最优方案,从后往前dp,令dp[i]为以第i个单词开始到结束的最小badness,并用p[i]记录以i开始的这一行的结束的单词,然后从前往后输出,则能保证空格排列的字典序最小。

#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[10010],p[10010];
char str[11000];
char w[11000][82];
int n,len[11000],num,cnt,Len;
int count(int sumlen,int j)
{
   // printf("ddd");
    if(j==1)
    return 500;
    int a;
    int q=(n-sumlen)/(j-1);
    int r=(n-sumlen)%(j-1);
    return a=r*q*q+(j-r-1)*(q-1)*(q-1);
   // printf("%d",a)
}
int main()
{
    int i,j,k,rec;
    while(scanf("%d",&n),n)
    {
        getchar();
        len[0]=0;
        num=1;
        cnt=0;
        while(gets(str))
        {
            if(str[0]==0)
                break;
            Len=strlen(str);
            for(i=0;i<Len;i++)
            {
                if(str[i]!=' ')
                {
                    w[num][cnt++]=str[i];
                }
                else if(i&&str[i-1]!=' ')
                {
                    len[num]=len[num-1]+cnt;
                  //  printf("num %d len %d\n",num,len[num]);
                    w[num][cnt]=0;
                    num++;
                    cnt=0;
                }
            }
            len[num]=len[num-1]+cnt; //printf("num %d len %d\n",num,len[num]);
            w[num][cnt]=0;
            num++;
            cnt=0;


        }
        memset(dp,0,sizeof(dp));
        for(i=num-1;i>=1;i--)
        {
         //   printf("i %d %s\n",i,w[i]);
            int MINX=inf;
            for(j=1;i+j-1<num&&len[j+i-1]-len[i-1]+j-1<=n;j++)
            {//printf("aa");
                 rec=dp[i+j]+count(len[i+j-1]-len[i-1],j);
                if(rec<=MINX)//必须小于等于,这样才能保证最小字典序。
                {
                    MINX=rec;
                  //  printf("MIn%d\n",MINX);
                    p[i]=i+j-1;
                }
            }
             dp[i]=MINX;
           //  printf("dp %d\n",dp[i]);
        }
       // printf("p %d\n",p[1]);
        for(i=1;i<=num-1;i=p[i]+1)
        {
            if(p[i]-i+1==1)
            {
                printf("%s\n",w[i]);
                continue;
            }
            int q=(n-(len[p[i]]-len[i-1]))/(p[i]-i);
            int r=(n-(len[p[i]]-len[i-1]))%(p[i]-i);
          //  printf("q %d r %d\n",q,r);
            for(j=i;j<p[i];j++)
            {
                printf("%s",w[j]);
                for(k=1;k<=(j-i+1>p[i]-i-r)+q;k++)
                    printf(" ");

            }
            printf("%s\n",w[p[i]]);
        }
        puts("");

    }
}


 

相关文章推荐

poj 1093 Formatting Text

/* * poj 1093 Formatting Text 数学模型: f[i]是以第i个单词为某行首,i到最后一个单词组成段落所能取得最小badness。 ...
  • baisung
  • baisung
  • 2012年05月20日 23:45
  • 570

OJ1093-Formatting Text

原题目:http://poj.org/problem?id=1093   //题目分析:题目大致意思是让你对一段文章进行调整,使其可以达到最佳的效果。题目中为了了衡量好与坏,特设定了一个bad数组...

1-1-4_formatting_html_text

FORMATTING HTML TEXT #//格式化HTML文本ELEMENTS WE WILL LOOK ATItalic and Bold //斜体粗体 Underline //下划线 ...

POJ 3428 Formatting function (文件输入)

题意:给出输入格式,判断它的参数是否相匹配。 * %s — argument as a string * %d — argument as an integer value, without an...
  • Tsaid
  • Tsaid
  • 2012年07月23日 15:43
  • 459

poj 1093 Sorting It All Out AOV网络+拓扑

一道拓扑的题,只是每增加一条拓扑一次,要注意是否有人为添加的边,也就是同一时刻有没有多个可选项。         这题少加了个return 0,错了n次……注意细节。          非...

POJ 2494 Acid Text 模拟

题目大意:给定CSS语言的图片合成器,要求编译运行并输出结果 首先过样例 这个应该问题不大 然后交上去WA 那么请注意以下问题 1.读入用char 然后构造成string 2.由于White Spac...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年10月29日 14:08
  • 941

POJ2525-Text Formalization

转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6746954   大致题意:        首先说明,下面所述的“...

poj2758 checking the text

hash+二分求LCP
  • sdfzyhx
  • sdfzyhx
  • 2016年05月31日 23:04
  • 192

POJ-2758 checking the text(哈希+二分)

POJ-2758 checking the text(哈希+二分)题目: Wind’s birthday is approaching. In order to buy a really reall...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1093 Formatting Text
举报原因:
原因补充:

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