Hdu3480 Division dp+四边形不等式优化

这题和上题差不多,先将这些数据排序,然后会很好想到dp[i][j]=dp[i][k]+w[k][j]这个状态转移方程;dp[i][j]是前j个数分为i组所得到的最小值,w[k][j]是指从下标为k的数到下标为j的数的集合的cost.

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

#define maxn 10010

#define inf 0x7fffffff

int dp[maxn][maxn];//dp[i][j]j个人分为i

int s[maxn][maxn];

int set[maxn];

int main()

{

    int T;

    int cas=1;

    scanf("%d",&T);

    while(T--)

    {

        printf("Case %d: ",cas++);

        int n,m;

        scanf("%d%d",&n,&m);

        int i,j;

        for(i=1;i<=n;i++)

        scanf("%d",&set[i]);

        sort(set+1,set+1+n);

        int ma=-inf;

        int mi=inf;

        for(i=1;i<=m;i++)

        {

 

            dp[i][1]=0;

            s[i][1]=0;

        }

        for(j=1;j<=n;j++)

        {

            dp[1][j]=(set[j]-set[1])*(set[j]-set[1]);

            s[1][j]=0;

        }

        int k,temp;

        for(i=2;i<=m;i++)

        {

            s[i][n+1]=n;

            for(j=n;j>=i;j--)

            {

                dp[i][j]=inf;

                for(k=s[i-1][j];k<=s[i][j+1];k++)

                {

                    temp=dp[i-1][k]+(set[j]-set[k+1])*(set[j]-set[k+1]);

                    if(temp<=dp[i][j])

                    {

                        s[i][j]=k;

                        dp[i][j]=temp;

                    }

                }

            }

        }

        printf("%d\n",dp[m][n]);

    }

    return 0;

}

 

 

 

 

 

 

 

 

 

   

你可能感兴趣的:(Hdu3480 Division dp+四边形不等式优化)