hdoj2670

Problem : 2670 ( Girl Love Value )     Judge Status : Accepted
RunId : 2682427    Language : G++    Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Sun 25 Jul 2010 04:32:08 PM CST
*File Name: main.cpp
*Description:动态归规化。但不是一般的动态归化,因为boy的值是不
*断减小的,但我们可以知道对于选中的每个boy总是按照他们的衰减值
*递减的次序来选,于是我们可以先排序,排序后从前往后每考虑一个
*boy,如果被选中的话,它总会被安排在最后选,这样就符合常规的动
*态归化了。dp[i][j]表示在前i个boy中选j个能得到的最大价值
\***************************************************************/

//*========================*Head File*========================*\\

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
/*----------------------*Global Variable*----------------------*/
int
dp[
1010][1010],n,K;
struct
Boy{
int
l,b;
}
boy[
1010];
//*=======================*Main Program*=======================*//
using namespace std;

bool
cmp(Boy a,Boy b){
return
a.b>b.b;
}


int
main(){

//freopen("input","r",stdin);
while(scanf("%d%d",&n,&K)!=EOF){
for
(int i=
1;i<=n;i++)
scanf(
"%d",&boy[i].l);
for
(int i=
1;i<=n;i++)
scanf(
"%d",&boy[i].b);
sort(boy+
1,boy+1+n,cmp);
// memset(dp,0,sizeof(dp));
dp[1][1]=boy[1].l;
for
(int i=
2;i<=n;i++)
for
(int j=
1;j<=i;j++)
if
(i==j)
dp[i][j]=dp[i-
1][j-1]+boy[i].l-(j-1)*boy[i].b;
else

dp[i][j]=max(dp[i-
1][j],dp[i-1][j-1]+boy[i].l-(j-1)*boy[i].b);
printf(
"%d\n",dp[n][K]);
}
}
原文地址:https://www.cnblogs.com/Open_Source/p/1904909.html