搬寝室

这道题我刚开始就理解错题意了,以为只要把给定的物品重量从小到大排序就可以了,

然后果断提交,果断wrong answer....纠结了发久,最后才明白这还是一个动态规划问题...

dp[i][j]表示前i件物品,选取j对的最小疲劳度,而dp[i][j]又由dp[i-2][j-1]+(c[i]-c[i-1])*(c[i]-c[i-1])和dp[i-1][j]对决定......

因此动态方程为:dp[i][j]=min((dp[i-2][j-1]+(c[i]-c[i-1])*(c[i]-c[i-1])),dp[i-1][j]);

做动态规划的题目关键是找到状态转移方程:

代码如下:

#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
#include
<algorithm>//sort函数用到
using namespace std;//sort函数用到
const int inf=0x7fffffff;
int B[2010][1001],A[2010];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int fun(int x,int y)
{
return x<y?x:y;
}
int main( )
{
int N,k,i,j;

while(scanf("%d%d",&N,&k)!=EOF)
{
// scanf("%d",&k);
//memset(B,0,sizeof(B));
//memset(A,0,sizeof(A));
for(i=1;i<=N;i++)
scanf(
"%d",&A[i]);
//qsort(A+1,N,sizeof(A[0]),cmp);
sort(A+1,A+N+1);
for(i=0;i<=N;i++)
for(j=0;j<=2*i;j++)
B[i][j]
=inf;
for(i=0;i<=N;i++)
B[i][
0]=0;
for(i=2;i<=N;i++)
for(j=1;j*2<=i;j++)
{
B[i][j]
=fun(B[i-2][j-1]+(A[i]-A[i-1])*(A[i]-A[i-1]),B[i-1][j]);
}


printf(
"%d\n",B[N][k]);
}
return 0;
}

posted on 2011-04-23 23:29  more think, more gains  阅读(146)  评论(0编辑  收藏  举报

导航