zoukankan      html  css  js  c++  java
  • 2013dgtcs 数字编码

    题目

        

    问题描述:

    一列有顺序的非负整数,需要把它们编码成一个0、1字符串进行传送。设这一列数为P={P1,P2,...,Pn},其中0<=Pi<32767,具体的编码方法为:把P分成k个段 S1,S2,...,Sk,在第i个段Si 中有a(i)个数字,且该段中每个数字都用b(i)位0、1串来编码表示,另外为了正确解码,还要在该段前面附加上一个消息头,用来指出该段有多少个数字以及每个数字的编码位数,消息头的格式规定如下:首先用8位二进制位表示a(i),这导致0<a(i)<256,另外由于0<=Pi<32767,即序列中每个数字最多用15位0、1串编码,因此接着用4位二进制位表示b(i) 。因此Si段编码后需要8+4+a(i)*b(i)位。按此格式,序列{P1,P2,...,Pn}的编码总位数为a(1)*b(1)+a(2)*b(2)+...+a(k)*b(k)+12*k 位,不同的分段方式可能对应不同的编码位数。

    例如,对数字序列{ 7,6,16,2,1,88,250,222},其最优分段方式是分为2段{7,6,16,2,1}和{88,250,222},a(1)=5,b(1)=5,a(2)=3,b(2)=8,所以该数字序列的最优编码位数为25+24+24=73位。

        你的问题是对于给定的数字序序列,按照上述编码规则,求最小的编码位数。

    数据输入:

    包含n+1整数,其中第一个为正整数n (n<=30000),表示序列的长度,之后是n个非负整数,表示待编码的数字序列。数与数之间用空格隔开。

    数据输出:

    只包含一个数,表示你计算出的最小编码位数。

    输入输出样例:

    coding.in

    8  7  6  16  2  1  88  250  222

    coding.out

    73

    大意

    •  首先我们需要将一个数列分为k段,a为s1的个数,b为s1中的最大数的二进制数位,计算

    分析

    • 我们用DP做,首先输入的每一个数先转化为二进制
    • 我们设f[i]为在i后面能产生的最小编码数和
    • 然后我们枚举一个j向后找更新值
    • 首先我们需要维护一个最大的二进制码数
    • 然后DP就很显然了
    • f[i]=min(f[i],f[j]+(j-i)*最大二进制位+12);

     

    代码

     1 #include<fstream>
     2 using namespace std;
     3 int f[100001],a[100001];
     4 int main ()
     5 {
     6     ifstream fin("coding.in");
     7     ofstream fout("coding.out");
     8     int n;
     9     fin>>n;
    10     for (int i=1,x;i<=n;i++)
    11     {
    12         fin>>x;
    13         int e=0;
    14         while (x>0)
    15         {
    16             e++;
    17             x>>=1;
    18         }
    19         a[i]=e;
    20     }
    21     for (int i=n;i>=1;i--)
    22     {
    23         f[i]=f[i+1]+12+a[i];
    24         int maxn=a[i],t=min(i+255,n+1);
    25         for (int j=i+2;j<=t;j++)
    26         {
    27             if (a[j-1]>maxn)
    28                maxn=a[j-1];
    29             f[i]=min(f[i],f[j]+maxn*(j-i)+12);
    30         }
    31     }
    32     fout<<f[1];
    33 }
    34  

     

    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10699692.html
Copyright © 2011-2022 走看看