1. 程式人生 > >p166 搬寢室 注意list的下標是從1開始的,(1)在sort的時候(2)在寫狀態轉移公式的時候

p166 搬寢室 注意list的下標是從1開始的,(1)在sort的時候(2)在寫狀態轉移公式的時候

我跟書上寫的不一樣,但是我的可以過,好理解。。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>

using namespace std;

//注意!list從下標為1開始list[j]表示第j件物體 
int list[2005];

int dp[1005][2005];

bool cmp(int a,int b)
{
	return a<b;
}

int min(int a,int b)
{
	return a<b?a:b;
}

int main()
{
	int n,k; 
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&list[i]);
		}
		sort(list+1,list+1+n,cmp);
		for(int i=0;i<=n;i++)dp[0][i]=0;
		//dp[i][j] 
		for(int i=1;i<=k;i++)
		{
			for(int j=2*i;j<=n;j++)
			{
				if(j==2*i)//第j個物品必須與第j-1個物品配對 
				{
					dp[i][j]=dp[i-1][j-2]+(list[j]-list[j-1])*(list[j]-list[j-1]);
				}
				else//第j個物品不一定要與第j-1個物品配對 
				{
					dp[i][j]=min(dp[i][j-1],dp[i-1][j-2]+(list[j]-list[j-1])*(list[j]-list[j-1]));
				}
			}
		}
		printf("%d\n",dp[k][n]);
	}
	
	return 0;
 }