本文主要是介绍Hdu oj 1421 搬寝室(dp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
搬寝室
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24168 Accepted Submission(s): 8276
2 1 1 3
4
题里说疲劳度等于两手物品重量之差的平方成,所以要让每对物品的重量差尽量小,显然两个物品重量越接近差越小,所以我们上来先对重量从小到大排序。再分析状态转移,对于每一对物品,我们都有两个选择,加或者不加,所以我们要取两者之中小的,由此可得到状态转移方程,其中dp[I][j]表示在前I个物品中取j对所能获得的最小疲劳值
dp[I][j] = min(dp[I-1][j] , dp[I-2][j-1]+(a[I]-a[I-1)^2) (j != 0)
dp[I][j] = 0 (j = 0)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2005;
const int Inf = 0x3f3f3f;
int a[maxn];
int dp[maxn][maxn];
int n,k;int main()
{while(~scanf("%d%d",&n,&k)){memset(dp,Inf,sizeof(dp));for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);for(int i=1;i<=n;i++)dp[i][0] = 0;for(int i=1;i<=n;i++){for(int j=1;j*2<=i;j++)dp[i][j] = min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));}printf("%d\n",dp[n][k]);}
}
这篇关于Hdu oj 1421 搬寝室(dp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!