HDU 1421 搬寝室——动态规划

来源:互联网 发布:办公oa软件下载 编辑:程序博客网 时间:2024/06/07 09:18

题目链接点击打开链接

一道经典的动态规划题。个人理解为是贪心思想和动态规划相结合。在hdu课件上看到这题,便做了。

dp[i][j]表示前i个物品选j对消耗的最小体力。dp的方法就是前i 个物品是否选第i个。转移方程为

dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(weight[i]-weight[i-1])*(weight[i]-weight[i-1]) )。

这道题真正让我WA n次的不是转移方程,而是dp数组的初始化。。。初始化init中内层for j要从1开始初始化为无穷大,dp[i][0]要初始化为0。Orz……

真是细节决定成败!!!

附上我搓的不行的AC代码

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<iomanip>#include<algorithm>#include<cmath>using namespace std;long long dp[2500][1500],weight[2500];void Init(int n,int k){    int i,j;    for(i=0;i<=n;i++)    {        for(j=1;j<=k;j++)            dp[i][j]=0x7fffffff;    }    for(i=0;i<=n;i++)        dp[i][0]=0;}int main(){    int n,k,i,j;    while( scanf("%d%d",&n,&k)==2)    {        for(i=1; i<=n; i++)            scanf("%lld",&weight[i]);        Init(n,k);        sort(weight+1,weight+n+1);        for(i=2; i<=n; i++)        {            for(j=1; j*2<=i; j++)                dp[i][j]=min(dp[i-1][j],dp[i-2][j-1] + (weight[i]-weight[i-1])*(weight[i]-weight[i-1]));        }        printf("%lld\n",dp[n][k]);    }    return 0;}


0 0
原创粉丝点击