hdu 1500 dp

/*
状态转移方程式:
dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j]));
依次求出第i个人在第j个数时的所求的最小值
*/
#include<stdio.h>
#include<string.h>
#define N 5100
int dp[1100][N];
int a[N];
int Min(int v,int vv) {
return v>vv?vv:v;
}
int main() {
    int t,k,n,i,j;
   scanf("%d",&t);
    while(t--) {
            scanf("%d%d",&k,&n);
            k+=8;
    for(i=n;i>=1;i--)//排成非递增数列
        scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        for(i=1;i<=k;i++) {
            dp[i][i*3]=dp[i-1][i*3-2]+(a[i*3-1]-a[i*3])*(a[i*3-1]-a[i*3]);//初始化
            for(j=i*3+1;j<=n;j++)//i*3是边界
                dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j]));
        }
        printf("%d
",dp[k][n]);
    }
return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410539.html