hdu1421 dp
用dp[i][j]表示放了i件物品,j对时的最小值。
dp[i-2][j-1]表示取当前的 dp[i-1][j]表示不取当前的。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 2002 #define INF 99999999 int dp[maxn][1002],a[maxn]; int min(int x,int y) { return x<y?x:y; } int main() { int i,j,n,k; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); memset(dp,0,sizeof(dp)); for(i=0;i<=n;i++){ for(j=0;j<=k;j++){ dp[i][j]=INF; } } for(i=0;i<=n;i++) { dp[i][0]=0; } for(i=2;i<=n;i++) { for(j=1;j<=k;j++) { //dp[i-2][j-1]表示取当前的 dp[i-1][j]表示不取当前的 dp[i][j]=min(dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]); } } printf("%d\n",dp[n][k]); } } /* 3 1 2 5 6 5 2 1 3 4 7 8 */