uva 709 - Formatting Text

过样例就交了,幸好是1y,好幸运。

dp[i][j]表示第i个单词在行中的起始位置是j时最小的坏值

分为两种情况考虑:

1、单独一行

2、与之前的或之后的单词一行

如果不知道这题类型是dp,我是肯定搞不出来的。(⊙o⊙)

#include <iostream>

#include<cstdio>

#include<cstring>

#define INF 0x3f3f3f3f

using namespace std;

char s[10005],words[10005][85];

int n,top,len[10005],dp[10005][85];



int DP(int i,int j)

{

    if(dp[i][j]!=-1)

    return dp[i][j];

    dp[i][j]=INF;

    if(i==top)

    {

        if(j==0)

        return dp[i][j]=0;

        else

        return dp[i][j];

    }

    //单独一行

    if(j==0)

    dp[i][j]=min(dp[i][j],500+DP(i+1,0));

    //与前面或后面的单词一行

    //行尾

    if(j+len[i]==n)

    return dp[i][j]=min(dp[i][j],DP(i+1,0));

    //行中

    else

    {

        //下一个单词可放位置

        int x=j+len[i]+1;



        for(int k=x;k<n;k++)

        {

            //此行k位置放不下下一个单词

            if(k+len[i+1]>n)

            break;

            int t=k-x;

            dp[i][j]=min(dp[i][j],t*t+DP(i+1,k));

        }

    }

    return dp[i][j];

}

void print(int i,int j)

{

    if(i==top)

    {

        puts("");

        return;

    }

    printf("%s",words[i]);

    if(j==0&&dp[i][j]==dp[i+1][0]+500)

    {

        puts("");

        print(i+1,0);

    }

    else if(j+len[i]==n&&dp[i][j]==dp[i+1][0])

    {

        puts("");

        print(i+1,0);

    }

    else

    {

        //下一个单词可放位置

        int x=j+len[i]+1;



        for(int k=x;k<n;k++)

        {

            //此行k位置放不下下一个单词

            if(k+len[i+1]>n)

            break;

            int t=k-x;

            if(dp[i][j]==t*t+dp[i+1][k])

            {

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

                putchar(' ');

                print(i+1,k);

                break;

            }

        }

    }

}

int main()

{

    while(scanf("%d",&n),n)

    {

        getchar();

        top=0;

        while(gets(s))

        {

            if(!s[0])

            break;

            int i=0;

            for(;s[i]==' ';i++);

            for(;s[i];)

            {

                sscanf(s+i,"%s",words+top);

                for(;s[i]!=' '&&s[i];i++);

                for(;s[i]==' ';i++);

                len[top]=strlen(words[top]);

                top++;

            }

        }

        len[top]=0;

        memset(dp,-1,sizeof(dp));

        DP(0,0);

        print(0,0);

    }

    return 0;

}

  

你可能感兴趣的:(format)