搬寝室
這道題我剛開始就理解錯題意了,以為只要把給定的物品重量從小到大排序就可以了,
然后果斷提交,果斷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;
}
轉載于:https://www.cnblogs.com/tangcong/archive/2011/04/23/2025962.html
總結
- 上一篇: jQuery 源码分析笔记(3)
- 下一篇: DLXPS