摘要: http://poj.org/problem?id=2385和天上掉馅饼那个差不多。dp[i][j]表示第i分钟移动了j步。一开始直奔馅饼的那个想法,所以就需要三唯的: i 第几分钟 ,j 哪个位置 ,k 移动了几步但是本题 只要两个位置 ,所以可以用k来表示了j所以就有了状态转移方程:dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+t[i][(j+1)%2];另外要注意初始化:View Code #include<iostream>#include<string.h>#include<stdio.h>#include<al 阅读全文
posted @ 2012-09-18 23:38 一把刷子 阅读(121) 评论(0) 推荐(0) 编辑
摘要: fill ( first, last, value );作用是设置指定范围内 [first,last).的元素的值为value;范围包括开始元素,单不含结束元素。*min_element(dp[n],dp[n]+m+1)返回最小值。 阅读全文
posted @ 2012-09-18 23:32 一把刷子 阅读(177) 评论(0) 推荐(0) 编辑
摘要: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2972一开始以为是那种类似加血的题目,但是这个题和加血的有个区别就是,是每一段有一个速度值,表示成加血的那样的状态有点复杂。所以,表示成简单一点的dp[i][j]表示到达第i段还剩j的force。所以显然根据题目所说的:有状态转移方程:dp[i][j]=min(dp[i-1][j]+t2,dp[i][j]);if(j>=f1)dp[i][j-f1]=min(dp[i-1][j]+t1,dp[i][j-f1]);int temp=j+f2;if(temp>m)t 阅读全文
posted @ 2012-09-18 23:26 一把刷子 阅读(205) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24028其实bfs 和dfs 两个的原理是一样的,都是找到最深的,不过都需要两遍第一次找到深度最深的,第二次以深度最深的 再找最深的View Code #include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<vector>#include<queue>#define inf ~0U>& 阅读全文
posted @ 2012-08-31 08:58 一把刷子 阅读(207) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24019根据性质来求解任何一个合数都可以表示成几个质数的乘积,质数的乘积是本身。任何一个数都可以表示成几个素数的和,素数是他本身比如要算 10!可以最大整除除以2 的多少次方a:10 9 8 7 6 5 4 3 2 1a列的数除以2 变为(取整)b:5 4 3 2 1同理得c:2 1那么ans=10/2+5/2+2/2可以这样考虑 因为是阶乘的,所以 这尼玛说不清了 看图吧 ,看看就明白了View Code #include<iostream>#incl 阅读全文
posted @ 2012-08-31 07:54 一把刷子 阅读(300) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24022思路:搜索具体看注释。View Code #include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char s[10][100];int a[10][20];int visit[50];int num[50];int add[50];int cnt=0;int mm=0;void in 阅读全文
posted @ 2012-08-30 21:12 一把刷子 阅读(179) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24020根据一般的字符串的dp,考虑串a的前i个,和串b的前j个那么我们用dp【i】【j】表示包含a串的第i个字母 b串的第j个字母 可以获得的最大长度那么显然有:因为要包含 i j 所以如果abs(a[i]-b[j])<=1 那么dp[i][j]=dp[i-1][j-1]+1; 否则dp[i][j]=0;View Code #include<iostream>#include<string.h>#include<stdio.h& 阅读全文
posted @ 2012-08-30 20:04 一把刷子 阅读(193) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1463有两种做法,一种是二分图,一种是树形DP,这里两种都做了。二分图的。就是经典的二分图最小点覆盖,要选取最小的点,使得所有的边与这些点关联,(可以一条边关联两个点,为了需要哟)那么我们建的是无向边,因为可以互相关联,还是利用经典的拆点思想,本来要若原图中i与j有边。我们要连的是i到j+n,j到i+n,但这样连的效果和i与j连,j与i连是一样的。所以为了节省空间,我们这样连然后就是匈牙利算法,求最小点覆盖=最大匹配数View Code #include<iostream>#include<string.h>#inc 阅读全文
posted @ 2012-08-30 00:45 一把刷子 阅读(640) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3211一个背包的简单应用。我们可以这样想,对于同一种颜色的衣服,把他们的总时间t算出来,那么做一个容量为t/2的背包,背包里放的是这种颜色的衣服,重量是洗这件衣服的时间,价值也是洗这件衣服的时间,那么洗这种颜色的衣服的所需最小时间就是 max(t-dp【t/2】,dp【t/2】)用g++交才能过,c++不行,这是怎么个回事??View Code #include<iostream>#include<string.h>#include<string.h>#include<stdio.h>#inc 阅读全文
posted @ 2012-08-29 16:03 一把刷子 阅读(376) 评论(0) 推荐(0) 编辑
摘要: memset的功能是将一快内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去。如memset(dp,0,sizeof(dp))其中dp为一个int型数组,因为int为4个字节,那么每一个字节的位置上都放 00000000 最好方的就是00000000 00000000 000000000 00000000 将该二进制转化为10进制后为0如果放-1 。则放的是 11111111 11111111 11111111 11111111 (每一个8为是-1的补码。)转化为十进制后也是-1但是放1 则放的是 00000001 00000001 00000001 00000001 转化为十进制后显然不 阅读全文
posted @ 2012-08-29 13:37 一把刷子 阅读(2374) 评论(0) 推荐(0) 编辑