搬寝室
这道题我刚开始就理解错题意了,以为只要把给定的物品重量从小到大排序就可以了,
然后果断提交,果断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) 编辑 收藏 举报