HDU2670 DP

题意:从n个男孩中挑出k个,每个人有两个属性u,v

怎样挑选能得到最大的value

定义状态:dp[ i ][ j ]:从前i个中挑出j个得到的最大value

对于第i个,若选择,dp[i][j]=dp[i-1][j-1]+a[i].u-a[i].v*(j-1)

                若不选择,dp[i][j]=dp[i-1][j]+0;

View Code
 1 #include<algorithm>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<stdio.h>
 5 using namespace std;
 6 const int maxn = 1005;
 7 struct node{
 8     int u,v;
 9 }a[ maxn ];
10 int cmp( node a,node b ){
11     return a.v>b.v;
12 }
13 int dp[ maxn ][ maxn ];//
14 ////dp[i][j]:从前i个中挑出j个得到的最大值
15 ////dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+u-v*(j-1))
16 int main(){
17     int n,k;
18     while( scanf("%d%d",&n,&k)==2 ){
19         for( int i=1;i<=n;i++ )
20             scanf("%d",&a[ i ].u);
21         for( int i=1;i<=n;i++ )
22             scanf("%d",&a[ i ].v);
23         sort( a+1,a+n+1,cmp );
24         memset( dp,0,sizeof(dp) );
25         for( int i=1;i<=n;i++ ){
26             for( int j=1;j<=k;j++ ){
27                 if( i-1<=j-1 ){
28                     dp[i][j]=dp[i-1][j-1]+a[i].u-(j-1)*a[i].v;
29                 }
30                 else{
31                     dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+a[i].u-(j-1)*a[i].v);
32                 }
33             }
34         }
35         printf("%d\n",dp[n][k]);
36     }
37     return 0;
38 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2909672.html