摘要: 题目描述:给出一n个数的整数序列,请你从这个序列中截出k段,每一段都连续,段之间可以不连续,使这k段的所有整数的和最大.解题思路:动态规划,开两个二维数组,DP1[i][j]和DP2[i][j],前者为包含第i个数的前i个数取出k个数的最大值,后者为前i个数取出j个数的最大值,状态转移方程为DP1[i][j] = max(DP1[i-1][j],DP2[i-1][j-1])+num[i],DP2[i][j] = max(DP2[i-1][j],DP1[i][j])。这样就很简单了,感觉别人写的都蛮长的,所以贴出来个自己写的短的。代码: 1 #include<iostream> 2 阅读全文
posted @ 2012-03-08 19:27 咖啡西瓜汁 阅读(158) 评论(0) 推荐(0)
摘要: 题目描述:XX有n根长度不同的木棒,有一天它把所有的木棒排成一行,用S1,S2,S3,...,Sn表示.量出每个木棒的长度Sk(1<=k<=n),它发现有两个木棒Si和Sj(1< = i < j < = n),它们之间的所有木棒都比Si要长比Sj短. 现在给出每个木棒的长度,你需要找到满足上述条件的两个木棒Si和Sj,使得j-i最大. (请使用分治法解此题)。解题思路:我是用的RMQ方法来找到一段区间的最小值和最大值,预处理复杂度为O(nlogn),以后查找任意区间最小值(最大值)复杂度为O(logn)。RMQ方法是动态规划rmq[i][j]表示以i开始的长度为2 阅读全文
posted @ 2012-03-08 19:18 咖啡西瓜汁 阅读(196) 评论(0) 推荐(0)