hdu 1421 搬寝室(dp)
2014-02-21 19:17
423 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1421
思路:先排序。
dp[i][j]表示前i件物品选j对的最优解。状态转移方程:
如果 i == j*2,只有一种选择,dp[i][j] = dp[i-2][j-1] + (a[i]-a[i-1])*(a[i]-a[i-1])
否则 dp[i][j] = min(
dp[i-2][j-1] + (a[i]-a[i-1])*(a[i]-a[i-1]) ,dp[i-1][j]).
思路:先排序。
dp[i][j]表示前i件物品选j对的最优解。状态转移方程:
如果 i == j*2,只有一种选择,dp[i][j] = dp[i-2][j-1] + (a[i]-a[i-1])*(a[i]-a[i-1])
否则 dp[i][j] = min(
dp[i-2][j-1] + (a[i]-a[i-1])*(a[i]-a[i-1]) ,dp[i-1][j]).
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int dp[2010][1010]; int main() { int n,k,a[2010]; while(~scanf("%d %d",&n,&k)) { for(int i = 1; i <= n; i++) scanf("%d",&a[i]); sort(a+1,a+1+n); memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i++) { for(int j = 1; j <= i/2; j++) { if(i%2 == 0 && j == i/2) dp[i][j] = dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]); else dp[i][j] = min(dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]), dp[i-1][j]); } } printf("%d\n",dp [k]); } return 0; }
相关文章推荐
- hdu 1421搬寝室(简单dp)
- hdu1421-搬寝室 (经典dp)
- [HDU 1421]搬寝室(富有新意的DP)
- HDU 1421 搬寝室 (线性dp 贪心预处理)
- hdu 1421 搬寝室 (DP)
- hdu1421 搬寝室(dp)
- hdu1421 搬寝室(普通DP)
- HDU 1421 搬寝室 简单DP
- HDU 1421搬寝室 DP
- hdu 1421 搬寝室 (DP)
- hdu 1421 搬寝室 dp 类似背包
- hdu 1421 搬寝室 DP
- hdu 1421 搬寝室 DP
- HDU 1421 搬寝室 二维DP
- hdu 1421 搬寝室 (dp)
- hdu 1421 搬寝室(经典dp)
- hdu 1421 搬寝室【dp】
- HDU1421搬寝室(简单DP)
- HDU--1421 -- 搬寝室 [DP] [滚动数组]
- HDU 1421:搬寝室【dp】