摘要:
怎么说这个题目,反正纯判断就可以了,不太废话,上代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int num[9][9];int used[9];int corner(int a, int b){ int i, j; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ if(used[num[a + i][b + j]]){ return 0; } used[num[a + i][b + j]] = 1; } } return 1; 阅读全文
摘要:
自我批评一下,如此简单的题我竟乱七八糟想了一通,批评批评,太废材了,这题就01背包,不说算了,代码:#include <stdio.h>#include <stdlib.h>int f[10001];int main(int argc, char **argv){ int i, j; int n, m; int a; scanf("%d%d", &n, &m); f[0] = 1; for(i = 0; i < n; i++){ scanf("%d", &a); for(j = m; j >= 阅读全文
摘要:
f[i]表示第i天获得的最大的美元,要是浮点类型(double),f[i] = max{f[i - 1], f[j] * num[i] / num[j]}, 0 <= j < i, f[0] = 100,1<= i < n 代码如下:#include <stdio.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))double f[100];int num[100];int main(int argc, char **argv){ int i, j; int n; scanf(& 阅读全文
摘要:
看了网上的一个人的代码,那个人是对分母循环,然后确定分子,然后搜最优解。但是他找分子的时候是考虑了一些范围的,想一下可以直接去掉这层考虑,等下说明,然后它用了gcd(最大公约数),我这里也把它去掉了,不过其实都不保险,因为吧,等下分析下: 利用的是j/i≈sqrt(p),可以写成j≈i*sqrt(p),然后i从1到n枚举,求j,然后判断j/i,这就是思路。 首先是要比sqrt(p)小的啊,i*sqrt(p)是分子,但是i*sqrt(p)是分数,而我们需要的是整数,那该怎么办,搜两个,一个是(int)(i*sqrt(p)),另一个是(int)(i*sqrt(p)) - 1,证明如下: i*sq. 阅读全文
摘要:
就是贪心,但是这个题目很猥琐,需要考虑打不过对方的情况,代码如下:#include <stdio.h>#include <stdlib.h>int a[100000], b[100000];int com(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(int argc, char **argv){ int i, j, ans = 0; int m, n; scanf("%d%d", &n, &m); for(i = 0; i < n; 阅读全文
摘要:
我不写结题报告吧,贴别人的,还是抱怨一下,题目没说清楚,说"且第i种箱子不能放在高度超过A_i的地方。"是箱顶不能超过而不是箱底不能超过,怪不得我的那个不能AC:先按照A_i 排序,最好用快速排序然后再按01背包枚举关键代码:===========================================qsort(1,n);f[0]:=true;for i:=1 to n do for j:=1 to c[i] do for k:=a[i] downto h[i] do if f[k-h[i]] then f[k]:=true;============================. 阅读全文
摘要:
刚开始还以为和那个硬币游戏一样,要用那种DP,然后我想破脑袋想不出来,后来看了题解才知道就是区间动态规划,那就简单了,方程我不写了,我的还有条件,麻烦得很,看代码里面吧。 对比了一下硬币游戏和这题,小感悟:如果是两人或多人的博弈游戏,那状态里就要有上回对方是怎么取舍的;但是如果只是自己去,那就是区间动态规划。 代码:#include <stdio.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))int num[100];int f[101][101];//f[i][j] 表示从i到j最大取得数int 阅读全文
摘要:
刚把这题昨晚,顺便就用最大匹配把这题做了,不给思路了,直接上代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int num[20];int f[20];int ans = 1;int from[20], used[20];int map[20][20];int n;int find(int k){ int i; for(i = 0; i < n; i++){ if(map[k][i] && !used[i]){ used[i] = 1; if(from[i] == - 阅读全文
摘要:
这题第一问就是最长上升序列,不解释。 第二问说一下,首先,如果i可以打到j,那就把i,j之间加一条边,然后搜最大匹配。最大匹配出来的结果是边数的结果,然后用节点数减去变数就是有多少条链(画图看),感觉好像生物里的氨基酸——多肽。 代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))struct num{ int x, y, z;}num[1000];int f[1000];int ans, n;int map[1000 阅读全文
摘要:
转的题解:最长公共上升子序列(LCIS)的平方算法预备知识:动态规划的基本思想,LCS,LIS。问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列)。首先我们可以看到,这个问题具有相当多的重叠子问题。于是我们想到用DP搞。DP的首要任务是什么?定义状态。1定义状态F[i][j]表示以a串的前i个字符b串的前j个字符且以b[j]为结尾构成的LCIS的长度。为什么是这个而不是其他的状态定义?最重要的原因是我只会这个,还有一个原因是我知道这个定义能搞到平方的算法。而我这只会这个的原因是,这个状态定义实在是太好用了。这一点我后面再说。我们来考察一下这个这个状态。思考这个状态能转移到哪些状 阅读全文