摘要: 题意:给出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 阅读全文
posted @ 2013-06-19 13:24 心向往之 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题意:给定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]);... 阅读全文
posted @ 2013-06-19 12:51 心向往之 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 题意:黑书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){ ... 阅读全文
posted @ 2013-06-19 12:29 心向往之 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 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 阅读全文
posted @ 2013-06-19 12:15 心向往之 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意:黑书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]) , 阅读全文
posted @ 2013-06-19 12:12 心向往之 阅读(699) 评论(0) 推荐(0) 编辑
摘要: 题意:给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。规定买任一类的珍珠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), 阅读全文
posted @ 2013-06-19 11:55 心向往之 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 题意:棋盘分割 黑书P116int a[8][8];int n;double SUM;int dp[15][8][8][8][8];int P(int x1, int y1, int x2, int y2){ int s=0; FOE(i, x1, x2) FOE(j, y1, y2) s+=a[i][j]; return s * s;}void readData(){ cin>>n; FOR(i, 0, 8) FOR(j, 0, 8){ cin>>a[i][j]; SUM+=a[i][j]; }}int solve(int k... 阅读全文
posted @ 2013-06-18 13:53 心向往之 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 题意: 黑书P113 括号配对1 空序列是规则序列2 如果S是规则序列,则(S)或[S]是规则序列3 如果A和B是规则序列,则AB是规则序列给定序列,要求尽可能少的添加括号使其成为规则序列,输出规则序列。分析:设dp[i][j]为S[i~j]最少需要增加的括号数,dp[i, j] = ( dp[i+1, j-1], dp[i, k] + dp[k+1, j] ) (i<=k<j)int dp[105][105],Div[105][105];string str;void init(){ string temp=""; //去除空格 int len=str.siz 阅读全文
posted @ 2013-06-18 13:44 心向往之 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题意:有n(n<=1000)个城市,m(m<=10000)条边,第i个城市油价为pi (pi<=100),每升油能行驶一公里,有q (q<=100)个询问,每个询问给出汽车油箱的容量c (c<=100),起点u,终点v,问从u到v最少花费是多少?分析:每个城市加多少油是未知的,借鉴dijkstra算法,每个城市可以加1单位的油,也可以转移到其它城市,用优先级队列来存储,每次取费用最小的状态。用b[i][j]表示到达点i,剩余油量为j的最小花费,避免无用计算。一开始枚举了所有能加的油量,TLE。const int N = 1001, M = 101;int p[N] 阅读全文
posted @ 2013-06-04 14:51 心向往之 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 题意:一条路上有n(n<=300)个洞,m(m<=100000)个公司,第i个公司可以修复连续区间 Li~ Ri 内的洞,花费为Vi。问至少修复k个洞,最小花费是多少?分析:先处理出一条线段覆盖 [l, r],并且右端点恰好在r上的最小代价V[l, r],然后dp(i, j) 表示前j个点,修复i个的最小代价,dp[i, j] = min ( dp[i, j-1], dp[i-r, j-r] + V[j-r+1, j] )const int M = 305;LL dp[M][M], a[M][M], ans;int n, m, k;int main(){ #ifndef ONLIN 阅读全文
posted @ 2013-06-02 14:27 心向往之 阅读(156) 评论(0) 推荐(0) 编辑