Input 每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).
Output 对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.
Sample Input
2 1 1 3
Sample Output
4
思路:先排序,要使疲劳度最小必须每次取相邻的两个。设dp[i][j]为第1到i中取j对的最小疲劳度。对于dp[i][j]可分为两种情况:①取i,则dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);②不取i,则dp[i][j]=dp[i-1][j]。那么就有dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]))。
#include#include using namespace std; int dp[2001][1001],a[2001]; int main() { int i,j,n,k; while(~scanf("%d%d",&n,&k)) { for(i=0;i<=n;i++) for(j=0;j<=k;j++) dp[i][j]=999999999; dp[0][0]=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); for(j=0;j<=k;j++) { for(i=1;i<=n;i++) { if((j<<1)<=i) dp[i][j]=min(dp[i-1][j],((i-2>=0 && j-1>=0) dp[i-2][j-1]:0)+(a[i]-a[i-1])*(a[i]-a[i-1])); } } printf("%d\n",dp[n][k]); } }