
HDU
bladeLight
这个作者很懒,什么都没留下…
展开
-
hdu 2686
这个题目在面试的时候被问到了,首先问我的是一个人版本的,然后增加到两个人版本的。题目的含义是:一个n*n的棋盘,每个棋盘上有金矿,该金矿拿走后就没有了,问一个人从(0,0)->(n,n)然后再从(n,n)->(0,0)(这次的路径不能和上次的重叠),使得两次的和最大。这道题目我一点思路也没有,网上看了一下,据说是双线程dp,状态转移方程为:dp(k,x1,y1,x2,y2)=max转载 2013-09-01 00:20:36 · 764 阅读 · 0 评论 -
hdu 1503 LCS
//7102576 2012-11-06 23:49:51 Accepted 1503 0MS 408K 1796 B G++ chen//1A 只需记录一下共同的位置,然后分段输出就行了 #includeusing namespace std;char x[105];char y[105];int c[105][105];int posx[105];int posy[105];原创 2012-11-06 23:47:22 · 474 阅读 · 0 评论 -
hdu 2845
超时代码:dpr[i]=max(dpr[j])+a[i],1//超时。。。。 #include#includeusing namespace std;int M,N,res;int i,j,k,m;int column[200005];int row[200005];int dpc[200005];int dpr[200005];int main(){ while(原创 2012-10-21 17:01:56 · 453 阅读 · 0 评论 -
hdu 2870
//枚举a,b,c转化为1505的问题,一次ac #includeusing namespace std;char mat[1005][1005];char comp[1005][1005];int m,n,i,j;//根据哪个字符寻找int up[1005][1005];int height[1005][1005];int ll[1005];int rr[1005];原创 2012-10-21 23:26:55 · 399 阅读 · 0 评论 -
hdu 2845 另一种dp
//使用cin竟然超时 //dp[i][0]=max(dp[i-1][0],dp[i-1][1]);//dp[i][1]=dp[i-1][0]+a[i] #includeusing namespace std;int M,N,i,j,k,m;int column[200005];//用于记录其中一行的最优值 int dpc[200005][2];int row[200005];原创 2012-10-21 17:45:50 · 366 阅读 · 0 评论 -
hdu 2087 kmp
//简单的kmp匹配,寻找子串的个数,找到一个之后移动相应的指针就行了 #includeusing namespace std;char a[1005];char b[1005]; int next[1005];void get_next(char const* ptrn,int plen,int* next){ int i=0; next[i]=-1; in原创 2012-10-19 18:07:58 · 883 阅读 · 0 评论 -
hdu 2594
//错了好几次,//1、 res>=s1.length(),应该是大于abc abc合并的情况可以证明 //2、 少写了res>s2.length(),abcabc abc这个反例可以证明 #include#includeusing namespace std;string s1,s2;int next[50005*2];void get_next(string str,in原创 2012-10-19 20:07:05 · 600 阅读 · 0 评论 -
hdu 1358 kmp
#includeusing namespace std;char s[1000005];int next[1000005];int n,i;void get_prefix(int len){ int k=0; for(int p=2;p<=len;p++){ while(k>0&&s[k+1]!=s[p]) k=next[k];原创 2012-10-19 16:57:21 · 618 阅读 · 0 评论 -
hdu 3746
//深入理解next数组(算法导论上的) //错误原因:等号写成了赋值号,自己还真犯这个错误了// 这儿还是有点小疑问,ababa这样的串,求出的next为00123//则5-next[5]=2,即串的长度为2,可本来前缀和后缀相等的串为aba长度为3,可见len-next[len]求的是不相互包含的串的长度//即为求的ab,我们需要添加的即为(len-next[len])-len%(le原创 2012-10-19 16:32:56 · 495 阅读 · 0 评论 -
hdu 3336 kmp
//我们在这里使用的是算法导论中求解π数组的方法并且用到了dp // dp【i】=dp【next【i】】+1,dp【next【i】】在前面的计算中一定计算过了,//1表示的是到i本身的这个前缀,比如abab来说//next数组值为0012,dp[1]=dp[next[1]]+1=1//dp[2]=dp[next[2]]+1=dp[0]+1=1,dp[3]=dp[next[3]]+1=dp[原创 2012-10-19 09:36:17 · 416 阅读 · 0 评论 -
HDU 1505 dp
//考察点:dp,hdu1506的变形//思路:我们以每一行为底,分别计算高度,扫描每一行,求的面积的最大值//提交情况:WA 2次,第一次,在i循环中又用到了i,改成j就行了。第二次,将scanf改成cin就过了,这题的数据比较恶心,会有多余的空格。//收获:编程要细心一些//AC code#includeusing namespace std;int k,r,c;char c原创 2012-06-11 22:37:55 · 487 阅读 · 0 评论 -
hdu 1198 深搜
//直接打表了,connect[x][y][z]表示x的z方向上的y,他们之间是否连通,x,y的取值为0-10,//分别代表那11中类型,z表示方向0表示右方,1表示上方,2表示左方,3表示下方//7236312 2012-11-23 22:37:23 Accepted 1198 15MS 1552K 2455 B G++ chen #include#include#includei原创 2012-11-23 22:35:13 · 684 阅读 · 0 评论 -
重写Max sum
#include#includeint t,n;int a[100005];int main(){ scanf("%d",&t); int cases=0; while(t--){ cases++; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); int start=a[0],all=a[0],原创 2013-04-18 17:24:47 · 609 阅读 · 0 评论 -
Hdu 1978 dp
一开始理解错了,以为是最后到达终点的时候必须为最后一步,实际上只要能够到达就行了。状态转移方程:dp[i+a][j+b]=dp[i+a][j+b]+dp[i][j],其中a+b边界条件:dp[1][1]=1,一开始为一种方法//7586093 2013-02-02 23:19:12 Accepted 1978 203MS 264K 682 B G++ chen#include#原创 2013-02-02 23:14:35 · 393 阅读 · 0 评论 -
hdu 1074 状态dp
//第一道状态dp,要理解那张图 //要学会定义变量 #include#include#includeusing namespace std;struct Homework{ string name; int deadline; int costime;};Homework work[16];struct DP{ int before;原创 2012-10-20 22:47:29 · 412 阅读 · 0 评论 -
hdu 2035 大数模
这里需要注意的是,写移位或者位运算符的时候要加上括号,不然容易出错。#include#include#define n 1000int compute_a_b(int a,int b){ if(b==1) return a%n; else if(b&1) return ((compute_a_b(a,b>>1)%n)*(compute_a_b(a,(b>>1)+1)%n)原创 2013-02-03 21:08:12 · 495 阅读 · 0 评论 -
hdu 1114
完全背包,注意:这一题是刚好装满,求最小值。//7589606 2013-02-03 20:34:26 Accepted 1114 140MS 260K 763 B G++ chen#include#include#includeusing namespace std;#define INF 0x7ffffffint p[505];int w[505];int dp[10005]原创 2013-02-03 20:28:56 · 347 阅读 · 0 评论 -
HDU 2159
这是一道二维完全背包的题目转移方程:边界条件://7579998 2013-02-01 18:13:11 Accepted 2159 46MS 268K 1071 B G++ chen//wA 原因,一开始将判断dp[i][j]写到求dp的那个地方了,细想一下,这是错误的,当放进下一个物品的时候,可能也会得到满足条件的情况//所以必须重新算 #include#inclu原创 2013-02-01 18:08:57 · 384 阅读 · 0 评论 -
Hdu 1421 搬寝室 dp
题意:从n件物品中选择k对物品(2*k状态转移方程:dp[i][j]表示从前i件物品中选择j对物品所得差的平方和值最小,我们首先要对a数组进行排序,因为只有取相邻数的情况下才能保证差值最小。 则有:i==2*j时,这时候,必须全部选完,有dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);原创 2013-02-02 12:05:36 · 394 阅读 · 0 评论 -
hdu 1011 树形背包
//7506735 2013-01-17 17:24:53 Accepted 1011 93MS 272K 1450 B G++ chen//第一道树形dp,转移方程为dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son[i]][k]),这里的k指的是父亲节点分给孩子节点的士兵个数 //这其实是保证父节点有足够士兵的前提下,对孩子节点进行的01背包,max中第一个式子原创 2013-01-17 17:26:29 · 328 阅读 · 0 评论 -
hdu 2577 How to Type 动态规划
设f[i][0]表示caps lock关闭时,输入到i这个位置时,需要type的最少次数,f[i][1]表示caps lock打开时,输入到i这个位置,需要type的最少次数。转移方程:1、当a[i]为大写字母时,f[i][0]=min(f[i-1][0]+2,f[i-1][1]+2);第一项表示表示如果i-1输入完后,caps lock为关闭时,需要用shift+字母,两次;第二项表示先原创 2013-02-01 13:52:16 · 441 阅读 · 0 评论 -
hdu 1864
//两点注意1、乘上100,我一开始乘上1000,本来想的保留两位小数应该先保留三位的,可是超空间了//2.不超过600是每类的意思,而不是每一个的意思 #include#includeusing namespace std;int dp[3000005];int Q,N,n,i,j;//每张发票的价值int val_n; int value[35];int goods[3]原创 2012-10-15 13:27:06 · 650 阅读 · 0 评论 -
hdu 2059 龟兔赛跑
//错误原因,除的时候要记得乘上1.0不然是不准确的 #include#includeusing namespace std;int L,N,C,T,VR,VT1,VT2;int p[105];int i,j;double dp[105];int main(){ while(cin>>L){ cin>>N>>C>>T>>VR>>VT1>>VT2;原创 2012-10-14 19:50:37 · 396 阅读 · 0 评论 -
HDU 1709 The Balance
//将砝码质量分为1 2 4 -1 -2 -4就能够用母函数来做了//思想是相同的#includeusing namespace std;int c1[10005];int c2[10005];int n,sum,res;int weight[105];int main(){ while(scanf("%d",&n)!=EOF){ res=sum=0; for(int原创 2012-05-18 11:34:26 · 511 阅读 · 0 评论 -
hdu 1864最大报销额 01背包
//当成0-1背包来做的//思路,先转化成整数,扩大100倍,首先删除不符合条件的,然后01背包//提交情况:Memory Limit Exceed 1次,一开始扩大了1000倍,不过我感觉还是应该扩大1000倍。//收获:printf("%0.2lf\n",(double)dp[(int)(all*100)]/100)中如果不强制转化为double的话,前面的保留两位小数的格式不起作用/原创 2012-06-05 16:35:32 · 627 阅读 · 0 评论 -
hdu 1506 Largest Rectangle in a Histogram DP 单调队列
//考察点:动态规划,又有说是单调队列(还不了解)//思路:为每一个点记录可以左最远延伸到的位置,和向右最远延伸到的位置//但是不能暴搜,会超时的。具体见下面的代码//提交情况:1.TLE 多次,原因:h[0]=h[n+1]设置成了0,会出现问题//提交情况:2.WA 多次,原因:必须要将数组改成__int64类型的才能通过//收获:使用l[i]=l[l[i]-1]这样的语句可以使滑动速原创 2012-06-05 20:25:43 · 584 阅读 · 0 评论 -
HDU 2955
//考察点:会不会使用dp//思路:一开始脑残了,以为是概率相加。。。正确的题意是,强盗抢完银行被捕的概率小于给定的值//我们拿第一个例子来说,不能抢第一个和第二个银行的原因是,1-(1-0.02)*(1-0.03)>0.04,故不符合题意//因此,本题中,我们应该把每个银行的存款加在一起,作为背包的总重量,不过对应概率要转化成逃跑//概率。还拿第一个例子来说,0.98*0.97表示可以逃原创 2012-06-04 22:08:25 · 441 阅读 · 0 评论 -
hdu 1231 同hdu1003
#includeusing namespace std;int sum[100005];int a[100005];int n;int main(){ int n,m; bool flag; while(scanf("%d",&m)&&m){ flag=false; sum[0]=0; for(int i=1;i<=m;i++){ scanf("%d",&a[i原创 2012-06-05 16:50:32 · 370 阅读 · 0 评论 -
HDU1171 Big Event in HDU
//这一题是看能够组合出哪些值,这些值距离sum/2最近的为最优的解#include#includeusing namespace std;int c1[250005];int c2[250005];int n,sum;struct Node{ int val; int count;};Node nd[55];int main(){ while(scanf("%d"原创 2012-05-16 21:57:36 · 357 阅读 · 0 评论 -
HDU 1003 Max Sum
//考察点:动态规划,转移方程sum[i]=max{a[i],sum[i-1]+a[i]}//wa两次,第一次没考虑全是负数情况;第二次没有考虑输出第一次出现那种情况//收获:初步体会到了动态规划//经验:好好学习动态规划//AC code#includeusing namespace std;int sum[100005];int a[100005];int n;int m原创 2012-06-04 19:26:16 · 340 阅读 · 0 评论 -
hdu 2602 Bone Collector(0 1背包)
//第一次提交:WA//原因:for(int j=V;j>=0;j--)此处j写成了j>0,但是此题可能会有重量//为0,但价值不为0的情况//5 0//2 4 1 5 1//0 0 1 0 0//输出结果应该为2+4+5+1=12#includeusing namespace std;int n;int N,V;int dp[1005];int value[1005];原创 2012-06-03 14:05:40 · 301 阅读 · 0 评论 -
Hdu 2800
Adding EdgesTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 314 Accepted Submission(s): 216Problem DescriptionThere are N+1 points原创 2010-05-09 00:29:00 · 1086 阅读 · 1 评论 -
hdu 1176 免费馅饼(数塔问题)
//考察点:dp,简单数塔,从下往上不断dp,最后得到的为最大值//思路,第0秒 5 //第1秒 4 5 6//第2秒 3 4 5 6 7//第3秒 2 3 4 5 6 7 8//第4秒原创 2012-06-06 21:51:14 · 714 阅读 · 0 评论 -
hdu 2084 数塔
#includeusing namespace std;int n,m;int dp[105][105];int main(){ scanf("%d",&n); while(n--){ scanf("%d",&m); int i,j; for(i=1;i<=m;i++){ for(j=1;j<=i;j++){ scanf("%d",&dp[i][j]);原创 2012-06-06 21:51:56 · 402 阅读 · 0 评论 -
hdu 1203
//这一题题目中给出的是选中的概率,我们要将其转化为选不中的概率,然后用(1-所有选不中概率相乘)就是选中的概率//将0,1背包转化为了dp[i]=min(dp[i],dp[i-value[i]]*weight[i]); #include#includeusing namespace std;double dp[10005];int value[10005];double weig原创 2012-10-14 15:31:24 · 1045 阅读 · 0 评论 -
hdu 1171
//将背包的体积设置为总容量的一半//使用多重背包看一半体积最多能放下多少东西 #includeusing namespace std;int V,i,j;int f[250000];int value[55];int number[55];int max(int a,int b){return a>b?a:b;}void zeroOnePack(int cost,int原创 2012-10-14 14:00:03 · 424 阅读 · 0 评论 -
hdu 1069
#include#includeusing namespace std;int n,i,j,ti;int x,y,z,num;struct Node{ int x,y,z; };Node nd[35*3];int height[35*3];//从小到大排序 int cmp(Node a,Node b){ return a.x>b.x;}int原创 2012-10-13 22:37:52 · 333 阅读 · 0 评论 -
hdu 2571
#include#includeusing namespace std;int n,m,i,j,k;int C;int mat[25][1005];int dp[25][1005];int max(int a,int b){return a>b?a:b;}int main(){ cin>>C; while(C--){ memset(dp,0,si原创 2012-10-13 17:24:13 · 383 阅读 · 0 评论 -
HDU 2602
//0-1背包,错误原因没有考虑j=0的情况//背包的容量可以为0 #includeusing namespace std;int t,N,V;int value[1005];int volume[1005];int f[1005];int i,j;int max(int a,int b){ return a>b?a:b;}int main(){ cin>原创 2012-10-11 17:00:10 · 363 阅读 · 0 评论 -
hdu 1754 线段树
//这次换了种写法写线段树,加深了自己的理解//6091831 2012-06-22 19:09:25 Accepted 1754 1234MS 8180K 1358 B C++ chen#includeusing namespace std;int n;//表示某个节点的左右int lef[200000*4];int righ[200000*4];//表示左儿子和右儿子的编号原创 2012-06-22 19:16:40 · 530 阅读 · 0 评论