HDU 1421 DP

还是这种思想:dp[i][j]表示前i件物品取j对的最优解

那么想想dp[i][j]是怎么来的,

(1)i==j*2    dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])

(2)i>j*2       dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]))

注意long long 会超时 多组输入

很奇怪的是 我数组开了2002*2002  WA了多次 开大一些  AC...无语...

贴代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 2050
#define ll int

ll dp[N][N];
ll a[N];

int main()
{
    ll n,k,i,j;

    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));
        dp[2][1]=(a[2]-a[1])*(a[2]-a[1]);

        for(j=1;j<=k;j++)
            for(i=j*2;i<=n;i++)
            {
                dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);
                if(j*2<i)
                {
                    dp[i][j]=min(dp[i-1][j],dp[i][j]);
                }


            }
        printf("%d
",dp[n][k]);
    }

    return 0;
}


原文地址:https://www.cnblogs.com/suncoolcat/p/3320185.html