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]); } }