雕刻时光

just do it……nothing impossible
随笔 - 547, 文章 - 0, 评论 - 82, 阅读 - 86万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  DP

摘要:http://wenda60.com/?programs.exam/a0bb3b20flzEY8AwZTTUBHBlYBUlRVAFMBVUpFSw题目描述完美世界最新的客户端游戏大作笑傲江湖最近已经开始测试了,由于希望参与的玩家太多,只能使用激活码的方式让一部分玩家可以参与测试,现在需要一个测试码的生成规则。如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。现在希望获得从一组N不同的数字中,获得和为C的组个的个数。组合的个数有可能是1个有可能是N个。输入格式第一行输入1个整数M,表示总得数据组数。 阅读全文

posted @ 2014-02-20 23:01 huhuuu 阅读(271) 评论(0) 推荐(0) 编辑

摘要:求序列的最长子序列中不可分割元素的数目。不可分割元素,肯定属于某一个最长子序列,首先做的就是把属于最长子序列的数提取出来,减小查找范围。怎么提取?可以用LIS(最长递增子序列)和LDS(最长递减子序列)。对序列,从前往后,求以每个数 a[i] 为底最长子序列数组index。从后往前,求以每个数a[i]为底的最长递减子序列数组index2。线扫一遍,如果index[i] + index2[i] == length+1(length表示最长子序列的长度),那么这个数就是属于某一个最长子序列的。 提取出来以后,对每个数a[i],看它所对应的index1[i] 在整个数组中出现几次,如果只出现一次,. 阅读全文

posted @ 2013-10-30 22:24 huhuuu 阅读(424) 评论(0) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?pid=1501如果一行数列里没有0,则我的方法是用两个变量正数与负数,sum表示前面数的乘积, 随时将sum 正负归类放在两个变量里,到 i 位置若为sum为负数,则在负数优先队列里找最大的负数去除到 i 位置若为sum为正数,则在正数优先队列里找#includedouble zmin;//ᅰ�ᅧ�double Fmax;//ᄌ쳐�double inp[100099];double dp[100099];int main(){ int n; while(scanf("%d",&n)!=EOF){ i 阅读全文

posted @ 2013-10-30 20:11 huhuuu 阅读(271) 评论(0) 推荐(0) 编辑

摘要:http://codeforces.com/contest/353/problem/CCodeforces Round #205 (Div. 2)C#includeint s[109999];int dp[109999];char str[109999];int Max(int a,int b){ if(a=0;i--){ if(str[i]=='0')continue; max=Max(max,all+dp[i]); all+=s[i+1]; } max=Max(all,max); ... 阅读全文

posted @ 2013-10-11 13:50 huhuuu 阅读(443) 评论(0) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?pid=1499给N个有开始结束的且有价格的项目 安排项目的顺序 使总价值最大将项目按结束时间排序,01背包 ,dp[i] 表示到第i个项目,最大的价值是多少j从后往前遍历,更新符合 条件的的dp[i]#include#include#includeusing namespace std;struct data{ int ll,rr; int v;}s[10999];int dp[10999];int cmp(data x,data y){ return x.rr=1;j--){ i... 阅读全文

posted @ 2013-10-03 22:06 huhuuu 阅读(246) 评论(0) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?pid=1527对于首尾不相连数组的最大子数组和我们比较熟悉首位相连时,有两种情况,一种是最大子段和在数组中间所以回到上个问题还有一种是最大子段和是首位连接的,这时先找最小的子段和,然后最大子段和就是数组总和减去最小字段和 两种情况取较大值 阅读全文

posted @ 2013-09-01 21:42 huhuuu 阅读(306) 评论(0) 推荐(0) 编辑

摘要:3abxcybzca转化---->1 1 12 2 13 2 1i :1->nj:1->ndp[i][j]=min(dp[i][j],dp[i-1][j+1]);View Code #include<stdio.h>char map[1009][1009];int a[1009][1009];int min(int a,int b){ if(a>b)return b; else return a;} int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0)return 0; 阅读全文

posted @ 2012-03-10 22:19 huhuuu 阅读(287) 评论(0) 推荐(0) 编辑

摘要:给出背包的容量W、物品费用,每件物品只能取一次,求装满背包的方案总数以及最优方案总数(使物品总价值最大的方案,这里背包不需要装满)输入描述第一行有一个数k,代表有k组样例,每组样例有n+1行,第一行有两个数n,W,分别代表物品的件数,和背包容量,接下来为n行 每行有两个数,物品的费用c、物品的价值w输出描述每个样例输出一行,包含两个数:装满背包的方案总数以及最优方案总数,中间用空格隔开样例输入11 102 3样例输出0 1装满背包的方案总数简单最优方案总数if(f[j].p<f[j-s[i].c].p+s[i].w) 更新数据if(f[j].p==f[j-s[i].c].p+s[i].w 阅读全文

posted @ 2012-02-04 18:20 huhuuu 阅读(496) 评论(0) 推荐(0) 编辑

摘要:题意:有数字n,m1-m的数字(数字个数无限制)可以组成多少个n完全背包dp[j]=dp[j]+dp[i-j];注意大数,刚开始没有写前导0,WA了一次View Code #include<stdio.h>#include<string.h>const int MOD=100000000;struct data{ int s[9];}dp[1009];data add(data a,data b){ int i=0; data ret; ret.s[i]=(a.s[i]+b.s[i])%MOD; for(i=1;i<9;i++) { ret.s... 阅读全文

posted @ 2012-01-13 14:54 huhuuu 阅读(260) 评论(0) 推荐(0) 编辑

摘要:疲劳奔跑,求最长跑了多少一开始没有看到题目的特殊性,一旦休息,就一直休息直到疲劳度为0dp[i][j] i表示到第i个跑点,j表示当时的疲劳度时最大,WA其实考虑了特殊性就是0,1背包了add[i]表示1-i的和dp[i]=max(dp[i],dp[i-j*2]+add[i-j]-add[i-2*j]);View Code #include<stdio.h>int dp[10009];int add[10009];int max(int a,int b){ if(a>b)return a; else return b;}int main(){ int n,m; whil... 阅读全文

posted @ 2012-01-10 09:32 huhuuu 阅读(337) 评论(0) 推荐(0) 编辑

摘要:每头牛在一定的时间段里挤奶,一共N个时间段,长度M,求最大挤奶量(类似于最大递增子序和1,3,2,4,3,6 最大和14)先排序,使时间段有序在求最大递增子序和View Code #include<stdio.h>#include<iostream>#include<algorithm>using namespace std;struct data{ int s; int e; int p;}s[1009];int dp[1009];bool cmp(data a,data b){ if(a.s==b.s) return a.e; else ... 阅读全文

posted @ 2012-01-09 10:55 huhuuu 阅读(627) 评论(0) 推荐(0) 编辑

摘要:将一段数列左右取,all+=th*s[i]求最大和是多少左右取涉及到两个动作,故开个二维dp[i][j]=max(dp[i-1][j]+s[i]*(i+j),dp[i][j-1]+s[n-j+1]*(i+j));View Code #include<stdio.h>#include<string.h>int s[2009];int dp[2009][2009];int max(int a,int b){ if(a>b)return a; else return b;}int main(){ int n; while(scanf("%d",&am 阅读全文

posted @ 2012-01-09 09:10 huhuuu 阅读(410) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=1948题目描述:给最多40根木棍,每根长度不超过40,要用完所有的木棍构成面积最大的三角形,求出最大的面积。f[j][k] 表示能否达到一边长为 j,另一边长为kif(j>=a[i])f[j][k]=f[j][k]||f[j-a[i]][k]if(k>=a[i])f[j][k]=f[j][k]||f[j][k-a[i]]View Code #include<stdio.h>#include<string.h>#include<math.h>#include<iostream>usi 阅读全文

posted @ 2011-12-05 21:22 huhuuu 阅读(274) 评论(0) 推荐(0) 编辑

摘要:如输入33 5 4 6输出 33 4 53 5 6思路:最长子序列有几个通过n*log(n)算出来再用dfs+路径记录输出所有的值View Code #include<stdio.h>#include<string.h>#include<stack>#include<iostream>using namespace std;#define MAXN 109int ok=0;int n,a[MAXN],s[MAXN];//ÐòÁдæÔÚsÀïint 阅读全文

posted @ 2011-11-06 21:09 huhuuu 阅读(411) 评论(0) 推荐(0) 编辑

摘要:dp[x][y][y]=nx,y,z分别代笔三座塔德高度,n是到达该高度最多需要//ta,tb,tc为该塔最高可达高度,可以降低时间复杂度View Code #include<stdio.h>#include<string.h>int dp[121][121][121];int main(){ int n; while(scanf("%d",&n)!=EOF) { int i,x,y,z; int a=0,b=0,c=0,ta=0,tb=0,tc=0;//ta,tb,tc为该塔最高可达高度,可以降低时间复杂度 memset(dp,-1... 阅读全文

posted @ 2011-10-30 15:15 huhuuu 阅读(261) 评论(0) 推荐(0) 编辑

摘要:读题发现 每个物品有三种执行方式:1。放到轻的那边2。放到重的那边3。不放dp[i][j]表示到第n个物品时,重量差为j时的重量小的一端的重量,不存在则为-1。View Code #include<stdio.h>#include<string.h>#include<iostream>using namespace std;int dp[109][2009];int a[109];int main(){ int i,j,t,n,add=0,s,z=0; scanf("%d",&t); while(t--) { z=0; s=0; 阅读全文

posted @ 2011-10-19 22:27 huhuuu 阅读(263) 评论(0) 推荐(0) 编辑

摘要:http://www.zybbs.org/JudgeOnline/problem.php?id=1668类似于数字金字塔的DP先对数字处理如:1 2 3 41 2 3 41 2 3 4就要处理成1 2 0 00 2 3 00 0 3 4因为是起点是左上角,终点是右下角,方便dp方程,所以赋值为‘0’,在转移方程:dp[i][j]+=max(max(dp[i][j+1],dp[i-1][j+1]),dp[i+1][j+1]);View Code #include<stdio.h>#include<iostream>using namespace std;int dp[10 阅读全文

posted @ 2011-10-11 21:20 huhuuu 阅读(354) 评论(2) 推荐(0) 编辑

摘要:题意:N头牛 公牛与公牛之间最小间隔K头母牛之前用排列组合的方法去思考,数据大,不能解i<=kf[0]=i+1当i头牛是母牛时,没什么限制,f[i]+=f[i-1]当i头是公牛时,之前要有K头奶牛,f[i]+=f[i-k-1]View Code #include<stdio.h>int dp[100009];int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF) { int i; for(i=0;i<=n;i++) { if(i<=k) ... 阅读全文

posted @ 2011-09-01 21:15 huhuuu 阅读(173) 评论(0) 推荐(0) 编辑

摘要:经典的dp,对我这种菜鸟有难度啊。。。由于石头可以围成一个环,所以要原来数据*2用记忆化搜索,其实就是dpView Code #include<stdio.h>#include<string.h>int a[209];int maxdp[209][209];int mindp[209][209];int sum[209][209];int max(int a,int b){ if(a>b)return a; else return b;}int min(int a,int b){ if(a>b)return b; else return a;}int dfs 阅读全文

posted @ 2011-08-02 18:13 huhuuu 阅读(1662) 评论(0) 推荐(0) 编辑

摘要:解题的思想用到了 类似最长递增子序的方法,先按起始时间升序排序,不断更新,到某点(包括改点)最大值排序的目的:可以把看似二维的区间降到一维!!!!O(n*n)dp[i]=max(dp[i],dp[j]+node[i].v);dp[i]放着的是包括i点,最大的价值View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;struct data{ int b,e; int v;}node[1009];int 阅读全文

posted @ 2011-07-27 10:09 huhuuu 阅读(359) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示