JOI君有N个装在手机上的挂饰,编号为1...N。 JOI君可以将其中的一些装在手机上。
JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件的挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有1个。
此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示。如果JOI君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数。
JOI君想要最大化所有挂饰的喜悦值之和。注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的。
标签:content put out hint log bsp clu 排序 main
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #define INF 100000000 6 using namespace std; 7 8 const int MAXN = 2005; 9 int n; 10 struct item{ 11 int a,b; 12 bool operator < (const item &x) const{ 13 return x.a>a; 14 } 15 }d[MAXN]; 16 bool cmp(item x,item y){ 17 return y<x; 18 } 19 20 int dp[MAXN][MAXN],vis[MAXN][MAXN]; 21 int dfs(int num,int free){ 22 if(free>n) free=n; 23 if(vis[num][free]) return dp[num][free]; 24 if(free==0) return 0; 25 if(num==n+1) return 0; 26 int ret=-INF; 27 ret=max(ret,dfs(num+1,free-1+d[num].a)+d[num].b); 28 ret=max(ret,dfs(num+1,free)); 29 vis[num][free]=1; 30 return dp[num][free]=ret; 31 } 32 33 int main() 34 { 35 int i,j; 36 scanf("%d",&n); 37 for(i=1;i<=n;i++) scanf("%d%d",&d[i].a,&d[i].b); 38 sort(d+1,d+1+n,cmp); 39 40 printf("%d\n",dfs(1,1)); 41 42 return 0; 43 }
标签:content put out hint log bsp clu 排序 main
原文地址:http://www.cnblogs.com/lindalee/p/7670058.html