HDOJ1421搬寝室(动态规划)

来源:互联网 发布:linux ed2k 下载工具 编辑:程序博客网 时间:2024/05/24 05:30

分析:题目意思应该很清楚,想到首先需把所有的东西按重量排下序,然后再想办法。数据不大但涉及很大量的重复问题,应该想到用动态规划思想。i表示要搬东西的数量,j表示要搬的次数,状态方程:dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(num[i-2]-num[i-1])^2

代码:

#include<iostream>#include<stdio.h>#include<cstring>#include<algorithm>using namespace std;int num[2010];int dp[2005][2005];//可改为滚动数组做,dp[3][2005],这样没超时,就没简化int main(){    int n,m,i,j;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<n;i++)            scanf("%d",&num[i]);        sort(num,num+n);        for(i=0;i<n;i++)        {            for(j=1;j<n;j++)                dp[i][j]=100000000;            dp[i][0]=0;        }        for(i=2;i<=n;i++)            for(j=1;j<=m,j<=i;j++)                dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(num[i-1]-num[i-2])*(num[i-1]-num[i-2]));        printf("%d\n",dp[n][m]);    }    return 0;}


原创粉丝点击