HDU 1421 搬寝室
2014-07-03 23:27
288 查看
这个题目想了一天,最后还是看的题解。
http://www.acmerblog.com/hdu-1421-%E6%90%AC%E5%AF%9D%E5%AE%A4-1891.html
还是没有dp的解题思想,受上一题影响老是想着转化成数塔形式,结果走了不少弯路。
第一感觉还是准的,首先按质量对这n件物品排序,然后每取两件物品,这两件物品必然相邻。
dp[i][j]表示前i件物品取j组的最小疲劳度。
那么分析一下状态转移方程:
如果i == j * 2,那么就是前n件物品全取,所以dp[i][j] = dp[i - 2][j - 1] + c,这里c = (a[i] - a[i - 1]) * (a[i] - a[i - 1]);
否则,对于这第i件物品有取和不取两种情况。
1、取,那么一定是取a[i-1]和a[i],两件物品,dp[i][j] = dp[i-2][j-1] + c;
2、不取,dp[i][j] = dp[i-1][j];
所以dp[i][j] = min(dp[i][j] = dp[i - 2][j - 1] + c, dp[i-1][j]);
空间上的优化:因为在每个i循环里都只用到dp[i-2]dp[i-1]dp[1]这三个数组,所以把前面不用的“折叠掉”。然后对这三项模3取余即可。
具体参见代码。
代码君
http://www.acmerblog.com/hdu-1421-%E6%90%AC%E5%AF%9D%E5%AE%A4-1891.html
还是没有dp的解题思想,受上一题影响老是想着转化成数塔形式,结果走了不少弯路。
第一感觉还是准的,首先按质量对这n件物品排序,然后每取两件物品,这两件物品必然相邻。
dp[i][j]表示前i件物品取j组的最小疲劳度。
那么分析一下状态转移方程:
如果i == j * 2,那么就是前n件物品全取,所以dp[i][j] = dp[i - 2][j - 1] + c,这里c = (a[i] - a[i - 1]) * (a[i] - a[i - 1]);
否则,对于这第i件物品有取和不取两种情况。
1、取,那么一定是取a[i-1]和a[i],两件物品,dp[i][j] = dp[i-2][j-1] + c;
2、不取,dp[i][j] = dp[i-1][j];
所以dp[i][j] = min(dp[i][j] = dp[i - 2][j - 1] + c, dp[i-1][j]);
空间上的优化:因为在每个i循环里都只用到dp[i-2]dp[i-1]dp[1]这三个数组,所以把前面不用的“折叠掉”。然后对这三项模3取余即可。
具体参见代码。
//#define LOCAL #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 2000 + 20; int dp[3][maxn]; int a[maxn]; int main(void) { #ifdef LOCAL freopen("1421in.txt", "r", stdin); #endif int n, k; while(scanf("%d %d", &n, &k) == 2) { int i; memset(dp, 0, sizeof(dp)); for(i = 1; i <= n; ++i) scanf("%d", &a[i]); sort(a + 1, a + n + 1); for(i = 2; i <= n; ++i) { int c = (a[i] - a[i - 1]) * (a[i] - a[i - 1]); for(int j = 1; j <= k && j * 2 <= i; ++j) { if(j * 2 == i) dp[i % 3][j] = dp[(i - 2) % 3][j - 1] + c; else dp[i % 3][j] = min(dp[(i - 1) % 3][j], dp[(i - 2) % 3][j - 1] + c); } } cout << dp[n % 3][k] << endl; } return 0; }
代码君
相关文章推荐
- hdu 1421 搬寝室
- HDU 1421 搬寝室
- HDU 1421 搬寝室 解题报告
- hdu 1421:搬寝室(动态规划 DP + 排序)
- HDU 1421 搬寝室【DP】
- hdu1421 搬寝室
- HDU 1421 搬寝室
- HDU 1421 搬寝室
- HDU 1421 搬寝室 DP
- HDU 1421 搬寝室(DP)
- HDU 1421 搬寝室
- HDU 1421 搬寝室
- 搬寝室 -HDU 1421 dp
- HDU 1421 搬寝室 (DP)
- hdu 1421(搬寝室)
- hdu1421 搬寝室(dp)
- hdu 1421 搬寝室--类背包问题
- HDU 1421 搬寝室 DP
- HDU1421搬寝室(简单DP)
- hdu 1421 搬寝室 DP