摘要:
题意:给出n(n<=200)块黄铜合金,每块具有铜含量和价钱。给出C个询问 , 形如: 在n块中取 M 块 使得这M块合金的铜含量在[cMin * M, cMax * M]这个区间所花费的最少价钱。分析:0/1背包 f[k][j] 表示选k块合金得到含量j的最小开销。f[k,j] = min f[k-1, j-v[i] ) + pri[i] , 有多个询问,但合金不变,所以预处理出所有情况。const int M=201;int n, m, v[M], w[M];int num, cmin, cmax;int f[21][20005];int main(){ scanf("%d 阅读全文
摘要:
题意:给定6种币值,使用尽量少的硬币,组成1 2 3 4……100,问平均要多少个,以及最多要多少个?分析:完全背包const int M = 1200;int a[7],f[M],tot,ma;void dp(int s){ memset(f,1,sizeof(f)); f[0] = tot = ma = 0; FOE(i, 1, 6) FOE(j, a[i], M) checkmin(f[j], f[ j-a[i] ]+1);//付j FOE(i, 1, 100){ FOE(j, 0, M-i) checkmin(f[i], f[j+i]+f[j]);... 阅读全文
摘要:
题意:黑书P117 决斗 分析:假设需要判断x是否能赢得整场战斗,把环看成链,x点拆成两个,那么编号为x的人能从中胜出的充分必要条件是他能与自己“相遇”。这样,在连续几个人的链中,只须考虑头尾两个人能否胜利会师,中间的则不予考虑。设meet[i][j]记录i和j能相遇,能则为true,否则为false,则问题转化为了是否能找到一个k,使得i 和 k, k和j均能相遇,而 i或j能打败k。const int M = 202;int n;int a[M][M], meet[M][M];void readData(){ cin>>n; char c; FOE(i, 1, n){ ... 阅读全文
摘要:
1836题意:求最长的先升后降序列分析:d1[i]记录a[1…i]的递增子序列长度,d2[i]记录a[n…i]的递增子序列长度。2593题意:求数组的最大两个子串的和分析:前后分别执行一遍最大子串和将1到i的最大和保存在Left[i]中,将n到i的最大和保存在Right[i]中枚举分割点i Left[i]+Right[i+1]的最大值即为所求2192题意:给三个字符串s1,s2,s3 问能不能用s1 s2的字母组合成s3 其中s1 s2中的字母相对顺序不能改变例如cat tree可以组成tcraete 但不能组成cttaree分析:dp(i,j)表示当前处理到s1[i] s2[j]处,dp(i 阅读全文
摘要:
题意:黑书P123 有一款方块消除的游戏,游戏规则如下:n个带颜色方块排成一列,相同颜色的方块连成一个区域(如果两个相邻方块颜色相同,则这两个方块属于同一区域)。游戏时,你可以任选一个区域消去。设这个区域包含的方块数为x,则将得到x^2个分值。方块消去之后,其右边的所有方块就会向左移动,与被消去方块的左边相连。求游戏的最大得分。分析:题目的方块可以表示成color[i], len[i], 1 <= i <= l,其中l表示有多少段不同的颜色方块。color[i]表示第i 段的颜色,len[i]表示第i 段的方块长度。设dp[i,j,k]表示把(color[i], len[i]) , 阅读全文
摘要:
题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p,输入的价格递增。 例如:31 101 11100 12需要买第一类1个,第二类1个,第三类100个按常规支付为 (1+10)*10 + (1+10)*11 + (100+10)*12 = 1551元(一共买了102个珍珠)但是如果全部都按照第三类珍珠的价格支付,同样是买102个,而且其中总体质量还被提高了,但是价格却下降了:(102+10)*12 = 1344元分析:设三种珍珠的个数和价格分别为(a1 p1), 阅读全文