04 2012 档案
摘要:对于每一个点由其上一步的结点传递过来,存在最优子结构,即对于正确路径的上的任意一点将都是最优的,并且存在最优子结构。保留最优值的时候注意方法,不然TLE。代码如下:#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#define MAXN 200000using namespace std;int N, M, dp[MAXN+5], G[MAXN+5], mm[MAXN+5];inline int max(in
阅读全文
摘要:给定各种数量的硬币,求能够组合成多少种符合题意的组合数。代码如下:#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#define MAXN 100000using namespace std;int N, M, dp[MAXN+5], p[105], n[105];void zobag(int x, int k){ int ans = 0; if (M>=k*p[x]) { for (int i = M
阅读全文
摘要:题义:给定一个不长于100的字符串,求输入完整个串的最少按键次数。思路:对于打完每一个字符后,保留其保留大写锁定和非大写的两种状态的最少按键次数即可,做题中竟然忘了在大写锁定的时候可以shift+alphabet可以打出小写。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <cctype>#include <algorithm>using namespace std;int dp[105][2]; // 零表示以小写结尾,1代表以大写结尾char s
阅读全文
摘要:这题是一个二维背包的题目,刚开始并没有那样去做,只开了一维的空间来存储状态,结果很多的数据都没有跑过去。其实这题这样来问的话可能就明了很多了,求在指定的容忍值和指定的杀怪数下,求最大能够得到了经验数,可能我们马上就能想到二维背包,一维为杀怪数,二维为容忍值,在做一个完全背包,可惜这题问的是在满足升级情况下最大的容忍值,这其实也能够用上面构建的模型了解决。只要的求解的过程每次将得到的经验值与给定的N进行比较,如果超过了N,那么说明当前的方案能够触发升级,再将此时剩余的容忍值传递出来就可以了。总而言之,题目对攻击次数和容忍值进行了限制,那么我们就要对限制的量进行动态规划。代码如下:#include
阅读全文
摘要:#include <cstdio>using namespace std;void print(char s, int size){ for (int i = 0; i < size-1; ++i) { for (int j = 1; j <= size+i; ++j) { if (j == size+i || j == size-i) { printf("%c", s); } else { printf(" "); } ...
阅读全文
摘要:博客里面还有以前写的解题报告,表示没看懂。这里直接计算其没有被录取的概率,每次去小的值即可代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#define MAXN 1005using namespace std;int N, M, s[MAXN];double p[MAXN], dp[10005];inline double min(double x, double y){ return x < y ? x : y;}void zobag(int x){ for (int i = N;
阅读全文
摘要:#include <cstdlib>#include <cstring>#include <cstdio>#define MAXN 105using namespace std;int N, seq[MAXN][MAXN], dp[MAXN][MAXN];inline int max(int x, int y){ return x > y ? x : y;}int DP(){ for (int i = 1; i <= N; ++i) { dp[N][i] = seq[N][i]; } for (int i = N-1; i >= 1; --
阅读全文
摘要:通过给定的数据组成可及的状态。最后再中中间开始遍历所有可及的状态。就是一个完全背包,用二进制优化。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#define MAXN 250005using namespace std;int N, dp[MAXN], p[55], n[55], total;void zobag(int x) { for (int i = total>>1; i >= x; --i) { if (dp[i-x]) { dp[i] = 1; } ...
阅读全文
摘要:简单动态规划,将长方体分解成六个,然后二重排序后,DP即可。对于当前方块,选择前面的能够放置的方块的最大值加上本身的高度。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define MAXN 200using namespace std;// 对于每个长方体,有三种不同的方法。int N, dp[MAXN];struct Node{ int x, y, z;}e[MAXN];inline int max(int x, int y){ r
阅读全文
摘要:01背包最裸模板题#include <cstdlib>#include <cstring>#include <cstdio>#define MAXN 1005using namespace std;int N, V, p[MAXN], v[MAXN], dp[MAXN];inline int max(int x, int y){ return x > y ? x : y;}void zobag(int x){ for (int i = V; i >= v[x]; --i) { dp[i] = max(dp[i], dp[i-v[x]]+p[x])
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1505自己写的屌丝代码:#include <cstdlib>#include <cstring>#include <cstdio>#define MAXN 1050using namespace std;int N, M, u[MAXN][MAXN], l[MAXN][MAXN], G[MAXN][MAXN];inline int max(int x, int y){ return x > y ? x : y;}inline int min(int x, int y)
阅读全文
摘要:先粘上TLE的代码,先对高度离散化,然后DP高度求解。复杂度过高。代码如下:View Code #include <cstdlib>#include <cstdio>#include <cstring>#include <map>#include <iostream>#include <algorithm>#define MAXN 100005using namespace std; int N, cnt;int seq[MAXN], cseq[MAXN];long long dp[MAXN]; map<int,in
阅读全文
摘要:这次看了这题的动态规划写法,顿时觉得好理解多了。这里要对dp[i]的意义进行一下说明,dp[i]表示从1~i包含第i个数的最大子串和,如果前i-1个数的包含i-1在内的最大和为正数的话,那么包含第i个数的最大子串和就是dp[i-1]+seq[i],否则dp[i] 就等于seq[i]了。该题的动态递归写法并没有直接给出最终答案的状态,但是却能够根据另外的状态推到出答案。这点值得我们思考。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#def
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1864这一题的题义真的让人很伤神啊。其中不超过600元,是指某一类物品的总和不超过600元,1000元是指整张发票的钱不超过1000元,对于浮点数,我们将其统一乘以100。该题背包的体积就是发票数,对于第 i 张发票,其最大报销额就是 dp[i] = Max[ ( dp[j]+Fee[i] ) <= LIMIT], 其中dp[j]可达(满足在1~i-1张发票之前能够报销j张发票,其总和为不超过额定最大报销额的最大值)。代码如下:#include <cstdlib>#include <c
阅读全文
摘要:先粘上E题代码:// Code for problem E/* * by purple * at 12-04-09 2:19:41 PM */#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;#define sz(x) ((int)((x).size()))#define out(x) printf(#x" %d\n", x)#define rep(i,n) for(int i=0;i<(
阅读全文
摘要:(转)C语言宏定义中的#,##,#@及\符号的作用来源:刘诗慧Rubby的日志1、#(stringizing)字符串化操作符 作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定 义中,且必须置于宏定义体中的参数名前。 如:#defineexample(instr)printf("theinputstringis:\t%s\n",#instr)#defineexample1(instr)#instr 当使用该宏定义时:example(abc); 在编译时将会展开成:printf("theinputstringis:\t%s\
阅读全文
摘要:题目就是概率的问题,意思是去抢A银行,被捉的概率是ai,抢B银行,被捉的概率是bi,因此不被捉的概率是(1-ai)*(1-bi)......因此整个题目我们用逃避概率来计算。代码如下:#include <cstdio>#include <cstring>#include <cstdlib> using namespace std;struct Node{ int m; double poss;}e[105];double dp[10005];int N, max;double poss;inline double Max(double x, double y
阅读全文
摘要:简单构图,构造一个S流向 S,M,L,X,T,赛事 T1,T2,T2...TN流向汇点T。代码如下:#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#define INF 0x3f3f3f3f#define MAXN 25using namespace std;int N, cap[40][40], flow[40][40], p[40], c[40], S = 0, T = 38;int hash[130], maxflow;void init(){ ma
阅读全文
摘要:不能恋爱问题。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int N;int G[505][505], visit[505], marry[505];struct P{ int h; char sex[5], style[105], fav[105];}p[505];int judge(int x, int y){ if (abs(p[x].h-p[y].h)>40) return 0; else if (p[x].sex[0] == p[y
阅读全文
摘要:题目给定N个老鼠,M个洞,在规定的时间后,将有天敌来猎捉它们,每个老鼠都有一个速度,求一种躲藏的策略,使得受威胁的老鼠最少。(每个洞中只能藏一只老鼠)该题可以将老鼠到达可及洞的情况看作是一个匹配,于是该题就是求一个老鼠到洞的最大匹配。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#define MAXN 100using namespace std;int n, m, s, v;int G[MAXN+5][MAXN+5], visit[MAXN+
阅读全文