#include <iostream> #include <iomanip> #include <string> #include <algorithm> #include <vector> #include <queue> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long ll; const int MAX_N = 2001; //输入 int n,k; int x[MAX_N]; //dp[i][j]代表从 i 件物品中搬 2*j 件物品的疲劳度 int dp[MAX_N][MAX_N]; void solve(){ memset(dp,0,sizeof(dp)); //初始化 for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ if(i-1 < 2*j){ //如果物品的数量少于需要搬的数量,那么自然是全部搬走 dp[i][j] = dp[i-2][j-1] + (x[i]-x[i-1])*(x[i]-x[i-1]); }else{ //否者,选择是否搬第 i 个物品 dp[i][j] = min(dp[i-1][j],dp[i-2][j-1] + (x[i]-x[i-1])*(x[i]-x[i-1])); } } } printf("%d\n",dp[n][k]); } int main() { while(scanf("%d%d",&n,&k) != EOF){ for(int i=1;i<=n;i++) scanf("%d",&x[i]); sort(x+1,x+n+1); //排序是为了保证第i个和第i-2个的差大于等于与第i-1个的差 solve(); } return 0; } /* 优化不够,时间和内存都很危险 608MS 17404K */
HDOJ 1421 简单动态规划
最新推荐文章于 2021-09-06 20:55:20 发布