我竟然做了一题水题,浪费我感情啊,5分钟内2个AC(还是1A);1.0-1背包View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int w[22];bool dp[20000000];int main(){ int n, m, i, j, b; while(~scanf("%d%d",&n,&b)) { m=0; for(i=1;i<=n;i++) scanf("%d",& Read More
posted @ 2012-08-10 20:05 To be an ACMan Views(268) Comments(0) Diggs(0)
二分法:适用于单调函数,单调增或单调减三分法:适用于单峰凸性函数,如二次函数缩写 l:left ,r: right , m1:mid 1,m2:mid2三分法模板:#define eps 10e-6double cal(){}//计算题目所需要的值while(l+eps<r){ m1=l+(r-l)/3; m2=r-(r-l)/3; v1=cal(m1); v2=cal(m2); if(v1<v2)l=m1; else r=m2;}AC代码:View Code #include<stdio.h>#include<string.h>#include<ma Read More
posted @ 2012-08-10 10:58 To be an ACMan Views(422) Comments(0) Diggs(0)
类似 《hdu 搬寝室》View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int dp[50003][4],a[50003];int main(){ int cas, n, m, i, j; scanf("%d",&cas); while(cas--) { scanf("%d",&n); a[0]=0; for(i=1;i<=n;i++) { scanf("%d" Read More
posted @ 2012-08-09 16:38 To be an ACMan Views(192) Comments(0) Diggs(0)
经典的区间DPdp[i][j]代表i->j区间内最多的合法括号数状态转移方程:if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j]=dp[i+1][j-1]+2;dp[i][j]=max{dp[i][k]+dp[k+1][j]};AC代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace st Read More
posted @ 2012-08-09 16:35 To be an ACMan Views(1671) Comments(1) Diggs(1)
首先申明:这题数据有很大问题当你输入都为负数时,程序就会出错如 2 3-1 -2 -3竟然输出-3。数据库里有都为负数的情况,我用别人AC代码改了一下测试过了,的确有这情况,但答案貌似是错的。又如 2 3-1 2 -3竟然输出1.这让我郁闷了很久。设输入的数组为a[1...n],从中找出m个段,使者几个段的和为最大dp[i][j]表示前j个数中取i个段的和的最大值,其中最后一个段包含a[j]。(这很关键)则状态转移方程为:dp[i][j]=max{dp[i][j-1]+a[j],max{dp[i-1][t]}+a[j]} i-1=<t<j-1因为dp[i][j]中a[j]可能就自身 Read More
posted @ 2012-08-09 12:15 To be an ACMan Views(2824) Comments(2) Diggs(0)
思路:把重物从小到大排序,计算出每2个相邻的重物产生的疲劳度,放在p[i]数组中,表示i与i+1这2个重物产生的疲劳度。dp[i][j]表示进行到第i个物品(i前面的物品不一定都选了,跟背包差不多,i表示进行到第i个物品),已经选了j对物品 产生的最小疲劳度。初始化:先把所有值赋值为INF(无穷大),然后dp[i][0]=0;(0<=i<=n)因为没选重物之前疲劳度为0; for(i=0;i<=n;i++) for(j=0;j<=k;j++) dp[i][j]=INF; for(i=0;i<=n;i++)dp[i][0]=... Read More
posted @ 2012-08-08 21:16 To be an ACMan Views(180) Comments(0) Diggs(0)
dp[i][j]记录疲劳度用了i,杀了j个怪所获得的最大经验。View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int dp[103][103];int w[103],p[103];int main(){ int n, m, k, s, i, j, x; while(~scanf("%d%d%d%d",&n,&m,&k,&s)) { for(i=1;i<=k;i++) scanf(&q Read More
posted @ 2012-08-08 20:45 To be an ACMan Views(158) Comments(0) Diggs(0)
用dp[j]记录用j块钱最小不录取的概率。初始化dp[]都为1.0,因为没有选录取的概率为0,不录取的概率为1;View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int w[10001];double p[10001],q[10001],dp[10001];int main(){ int m, n, i, j; while(~scanf("%d%d",&m,&n)&&(n||m)) { fo Read More
posted @ 2012-08-08 20:07 To be an ACMan Views(154) Comments(0) Diggs(0)
中文题,题意自己看。思路:1.如果一开始钱少于5元,不买东西,按原值输出;2.否则,先拿这五块钱买最贵的一份菜(输入菜的价格后用sort排序一下),然后对其它n-1个菜进行0-1背包处理View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool dp[1001];int a[1001];int main(){ int i, j, n, m; while(~scanf("%d",&n)&&n) { f Read More
posted @ 2012-08-08 20:02 To be an ACMan Views(230) Comments(0) Diggs(0)
不解释View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;bool dp[10003];int main(){ int cas, m,a[4]={0,150,200,350}; int i, j; scanf("%d",&cas); while(cas--) { scanf("%d",&m); memset(dp,0,sizeof(dp)); dp[0]=1; for(i=1;i<= Read More
posted @ 2012-08-08 19:57 To be an ACMan Views(146) Comments(0) Diggs(0)