T1.能量项链

  给出一串数字(其实是个环也就是可以旋转)。n个数组成n颗珠子,形如: 1 2 3 4 表示的珠子是(1,2)(2,3)(3,4)(4,1)

  定义珠子的聚合:如前两颗聚合放出能量为1*2*3;

  求珠子合并能放出的最大能量。

  

  显然是一个区间dp,把链拉为两倍,从而线性解决。设tpl[i]=第i颗珠子的左边值,tpr[i]=第i颗珠子右边值,f[i][j]表示聚合i,j之间珠子的最大能量。

    f[i][j]=max(f[i][j],f[i][tmp]+f[tmp+1][j]+tpl[i]*tpr[j]*tpr[tmp]);

 

T2.金明的预算方案

  n元钱m个物品,有一些是某些物品的附属品。现给出每个物品花的钱和重要度以及附属哪个物品,求最大的(价格*重要度)总和。

  dp,由于每个物品最多只有两个附属品,所以直接对每个主品dp。

  f[i][j]表示前i个主品花j的钱获得的最大值

  f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i],f[i-1][ j-w[i]-w[a1[i]] ]+v[i]+v[a1[i]]

        f[i-1][ j-w[i]-w[a2[i]] ]+v[i]+v[a2[i]],f[i-1][ j-w[i]-w[a1[i]]-w[a2[i]] ]+v[i]+v[a1[i]]+v[a2[i]]);

T3.作业调度方案

  有n个工件,每个工件有m道工序,现在有m台机器来完成。每台机器同一时刻只能进行一道工序,每道工序必须在其之前的工序完成后才能进行。现给定工序的安排顺序和每个工序的加工机器号和加工时间,求最小安排时间。

  模拟,根据给出的顺序,到相应的机器上找第一段够长的时间安排进去最后取每台机器时间的最大值即可。

T4.2^k进制数

  设r是个2^k 进制数,并满足以下条件: 
  (1)r至少是个2位的2^k 进制数。 
  (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。 
  (3)将r转换为2进制数q后,则q的总位数不超过w。 
  在这里,正整数k(1≤k≤9)和w(k<w≤30000)是事先给定的。 
  问:满足上述条件的不同的r共有多少个? 
  我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2^k 进制数r。 
  例:设k=3,w=7。则r是个八进制数(2^3=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有: 
2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个。 
  3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个。 
  所以,满足要求的r共有36个。

  

  (下转,原文见:http://hzwer.com/794.html)

  题目中的那个从另一角度分析就已经蕴含了这个题的基本思路。就以题目的例子为例,长度为7位的01字串按3位一段就这样分:0 000 000。其中除了首段,每段都小于(111)2,也即小于2k,而首段自然是小于2w%k(对于w%k为0时也成立)了。

 如果首段为0,则当这个2k进制数位数分别为2、3、…、[n/k]时,如果用b_max表示2k,对应的解的个数分别为C[b_max-1][2]、C[b_max-1][3]、…、C[b_max-1][n/k](C[i][j]表示从i个数里选j个构成一组组合)。

    如果首段不为0,设首段为x,则解就有c[b_max-x-1][n/k]个。

    这样,求解的个数就搞定了,剩下的活就是高精了。求组合数可以用这个公式:C[n][m]=C[n-1][m-1]+C[n-1][m],这样高精就只用加法了。

posted on 2016-10-11 15:12  啊?  阅读(582)  评论(0编辑  收藏  举报