-
题目意思:
给你一个n和n个数,从中选出k个,使疲劳最小。。
疲劳计算方法:(两手物品质量差的平方)。
分析:先进行排序,只有当拿相邻的两个物品时,才有可能最小。。
典型的DP: dp[ i ] [ j ]=min( dp[ i -1] [ j ] , dp[ i-2 ] [ j-1]+a[i-1]);
dp[i][j]表示:从i个物品中拿j个的最小疲劳值。。
-
#include<cstdio> #include<algorithm> #include<cstring> #define pow(a) (a)*(a) using namespace std; int dp[2001][1001],a[2001]; int n,k; void solve() { memset(dp,0,sizeof(dp)); for(int i=2;i<=n;i++){ int r=i/2; for(int j=1;j<=r;j++){ if(i==2*j) dp[i][j]=dp[i-2][j-1]+pow(a[i]-a[i-1]); else dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+pow(a[i]-a[i-1])); } } } int main() { while(scanf("%d%d",&n,&k)!=EOF){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); solve(); printf("%d\n",dp[n][k]); } return 0; }
hdu 1421 搬寝室 (DP)
最新推荐文章于 2019-03-18 20:48:45 发布