随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

整齐打印

参考 http://blog.csdn.net/wenlei_zhouwl/article/details/5992367

问题: 考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是n个长度分别为L1、L2、……、Ln(以字符个数度量)的单词构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符。“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格字符个数为 M - (j-i) - (Li+ …… + Lj),它必须是非负值才能让该行容纳这些单词。我们希望所有行(除最后一行)的行末多余空格字符个数的立方和最小。请给出一个动态规划的算法,来在打印机整齐地打印一段又n个单词的文章。分析所给算法的执行时间和空间需求。

分析: 
构建数组a[i]代表包含1->i单词的最优“整齐度”——空格的立方总和。开始时,令a[0]=0。a[i]的递推式如下
 
W[k][i]代表将k到i的单词写入一行时,该行的多余空格数的立方。
 
每次计算a[i]时,循环k从i-1开始,直到某个k值使得 值为负,则跳出。
最终a[n]即为所求的最小立方总和。

程序:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdlib>
#include<climits>
using namespace std;
 
int main(void)
{
    void zq_print(void);
 
 
    zq_print();
    return 0;
}
 
void zq_print(void)
{
    //输入数据
    int num,M,count;
    int p,q,i,j,flag;
     
 
    cin>>num;
    cin>>M;
    string* data=new string[num];
    for(i=0;i<num;i++)
    {
        cin>>data[i];
    }
 
    int *line=new int[num]();
    int *c=new int[num];
 
    memset(c,0,num);
 
    p=0;flag=0;q=0;count=0;
    while(p<num)
    {
        line[q]=INT_MAX;
        for(i=p;i<num;)
        {
            /*计算的累加值*/
            int sum=0;
            for(j=p;j<=i;j++)
                sum+=data[j].size();
            //计算3次方
            int temp=(M-i+p-sum)*(M-i+p-sum)*(M-i+p-sum);
            if(q>=1)
                temp+=line[q-1];
            if(temp>=0 && (temp<line[q]))
            {
                flag=i;
                c[q]=flag;
                line[q]=temp;
                i++;
            }
            else
                break;
            //现在判断flag的值,是不是到达最后一行
        }
 
        ++q;
        ++count;
        if(flag==num-1)
            break;
        else
            p=flag+1;
    }
 
    cout<<"count="<<count<<endl;
    for(i=0;i<count;i++)
    {
        cout<<c[i]<<"--->"<<line[i]<<endl;
    }
    //共count行
    for(i=0;i<count;i++)
    {
        int begin=0;
        if(i>0)
            begin=c[i-1]+1;
 
        for(j=begin;j<=c[i];++j)
            cout<<data[j]<<" ";
        cout<<endl;
    }
 
    delete [] c;
    delete [] line;
    delete [] data;
}

  

posted on   紫金树下  阅读(479)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示