2011年2月26日

poj 1285

摘要: 题意在一组数中选择若干个数的情况。有20个数:1 1 1 2 2 2 2 3 3 4 4 4 4 4 4 5 6 7 8 9选2只有有40种情况当开始想错了,咳!#include<iostream>#include<fstream>using namespace std;int n,m;long long dp[51][51];int num[51];void read(){// ifstream cin("in.txt"); int i,j,k; int K; int ans=0; while(1) { cin>>n>>m; 阅读全文

posted @ 2011-02-26 16:46 宇宙吾心 阅读(308) 评论(0) 推荐(0)

poj 1636

摘要: 题意:有两个元素个数都为N的集合,要交换N/2个元素,但有些元素不能在一起,求最多能交换多少元素?1号监狱的某a个人和2号监狱的某b个人是被“绑定”的,即这a个人中的任何一个人都不能和那b个人中任何一个人在同一监狱。比如:1号监狱的5号犯人和2号监狱的8号9号不能在一起,2号监狱的8不能和1中的2,2号监狱的9不能和1的3,那么1中的2 3 5与2中的8 9被“绑定”,必须同生共死!这样把数据分成若干组,接下来就可以DP了:现在问题转化为:有p对儿数a[i],b[i],1<=i<=p,选出一些对儿,使SUMa == SUMb并且sum<=m/2dp:dp[k][i][j]=d 阅读全文

posted @ 2011-02-26 15:01 宇宙吾心 阅读(1108) 评论(0) 推荐(0)

poj 2378

摘要: 题目大意:给定一棵树的n个节点和n-1条边,对于每个节点,要求去掉它之后所有子树的最大节点数,并输出最大节点数小于n/2的节点编号简单题。两次dfs即可。#include<iostream>#include<fstream>using namespace std;typedef struct e{ int data; e* next;}e;int n;e edge[10001];int d[10001];int v[10001];int dp[10001];int solve(int s){ d[s]=1; v[s]=1; e *p=edge[s].next; whil 阅读全文

posted @ 2011-02-26 11:25 宇宙吾心 阅读(284) 评论(0) 推荐(0)

poj 2626

摘要: 题意:从n个人中选出15人先手,15人后手,求最大能力。简单dp。dp[i][j][k]=max(dp[i-1][j][k-1]+a[k],dp[i][j-1][k]+b[k],dp[i][j][k-1]);dp[i][j][k]表示从k人中选出i个先手,j个后手的最大能力。#include<iostream>#include<fstream>using namespace std;int n;int a[1001],b[1001];int dp[16][16][1001];void read(){// ifstream cin("in.txt"); 阅读全文

posted @ 2011-02-26 10:51 宇宙吾心 阅读(286) 评论(0) 推荐(0)

poj 1946

摘要: 题目大意:有n只奶牛进行骑自行车环跑,一分钟跑x圈,领跑的消耗x * x体力,而后面跟跑的消耗x体力。现在输入N, E, D表示有N头奶牛,每头奶牛原先所具有的能量为E,D表示需要环跑的圈数。注意:只要有一只奶牛先达到D圈,就算完成环跑,问奶牛能否完成环跑,如果不能,输出0,否则,输出环跑的最短时间。思路: 最优解必为奶牛1..n-1轮流领跑,奶牛n撞线。且跑了x圈后,未领跑过的奶牛都耗费了x的体力。设dp[i][j][k]表示前i-1头奶牛已领跑,现在由第i头奶牛领跑,一共跑了j圈,奶牛i耗费了k的体力。则dp[i][j][k]可以转移到dp[i][j + p][k + p2](耗费1分钟, 阅读全文

posted @ 2011-02-26 10:18 宇宙吾心 阅读(848) 评论(0) 推荐(0)

导航