p166 搬寢室 注意list的下標是從1開始的,(1)在sort的時候(2)在寫狀態轉移公式的時候
阿新 • • 發佈:2019-01-30
我跟書上寫的不一樣,但是我的可以過,好理解。。
#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; }