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(dp)

题意:输入一段短文(所有字符总数不超过10000),要求格式化成两端对齐(每行长度为n,1 题目链接:http://poj.org/problem?id=1093 ——>>状态:dp[i]表示从第i...
  • SCNU_Jiechao
  • SCNU_Jiechao
  • 2014年10月22日 20:41
  • 778

uva 709 &poj 1093 - Formatting Text (dp之小白告一段落)

709 - Formatting Text Writings e-mails is fun, but, unfortunately, they do not look very nice, mai...
  • u010228612
  • u010228612
  • 2014年03月06日 21:15
  • 1040

POJ 1093 Formatting Text(DP)

题意:给出一段文章,要求将里面的单词按照n个字符一行来分,不够一行的可以在单词间插入空格来得到,一行有一个basness值,为一个每个gap之间的空格数-1的平方,求badness总和最少的分隔方式....
  • zxjcarrot
  • zxjcarrot
  • 2014年04月05日 18:35
  • 592

poj 1093 Formatting Text (DP)

#include using namespace std; const int MAXN = 10000; const int MAXM = 81; const int INF = IN...
  • dreamxstudio
  • dreamxstudio
  • 2012年07月31日 16:01
  • 76

POJ 1093 Formatting Text 笔记

给出每行的宽度,使文章看起来舒服,即单词间隔-1的平方和最小。
  • woniupengpeng
  • woniupengpeng
  • 2017年05月10日 19:45
  • 528

Formatting Text - UVa 709 POJ 1093 dp

Formatting Text Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2017  ...
  • u014733623
  • u014733623
  • 2014年08月06日 15:21
  • 345

uva 907 pku 1093 formatting text

Formatting Text Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1099  ...
  • chengouxuan
  • chengouxuan
  • 2010年11月28日 10:22
  • 496

Some text formatting may have changed in this file because the maximum number of fonts was exceeded解决办法

google资料: 1. http://www.mrexcel.com/forum/showthread.php?t=354225You are getting the following messa...
  • lhooouuu
  • lhooouuu
  • 2011年06月29日 16:20
  • 4296

uva 709 Formatting Text

import java.io.*; import java.math.BigInteger; import java.util.*; class pair { int left...
  • dyhu083
  • dyhu083
  • 2014年02月26日 13:26
  • 350

uva709 - Formatting Text(递推)

题目:uva709 - Formatting Text(递推) 题目大意:给你一段文章,里面有很多的单词。要求你排版,按照题目给定的长度,并且要求每一行要以单词开头,单词结束。如果一行只有一个单词...
  • u012997373
  • u012997373
  • 2014年08月26日 10:56
  • 543
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1093 Formatting Text
举报原因:
原因补充:

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