Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
解題思路:
對n中物品的重量排序
dp[i][j]表示前i個物品中選j對的最小疲勞度。
①則dp[i][j]可能含有第i個物品(這種情況下,第i種物品一定是和第i-1個物品配對),則dp[i][j]=dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1])
②dp[i][j]的j對也可能不含有第i個物品,此時有dp[i][j]=dp[i-1][j]
狀態轉移方程
dp[i][j]=min{dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]),dp[i-1][j]注意dp[0][k]的情況。
AC代碼:
#include <stdio.h> #include <string.h> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int dp[2000][2001]; int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF){ dp[0][0]=dp[1][0]=0; int val[2010]; for(int i=1;i<=n;i++){ scanf("%d",&val[i]); } sort(val,val+n+1); for(int i=0;i<=n;i++){ for(int j=1;j<=n;j++){ dp[i][j]=INF; } } for(int i=2;i<=n;i++){ for(int j=1;2*j<=n;j++){ dp[i][j]=min(dp[i-2][j-1]+(val[i]-val[i-1])*(val[i]-val[i-1]),dp[i-1][j]); } } printf("%d\n",dp[n][k]); } }