摘要:
这题有两种解法, 一种是通过动态规划弥补一个不太成熟的贪心思路, 使得最后的结果正确. 另一种方法是构造一个更好的贪心策略.动态规划依托的结论: 每次给齐王最强的马匹配一匹田忌的马, 那么这匹马不是田忌最强的马就是最弱的马, 这一个不完善的贪心策略. 所以动态规划佐之.#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>using namespace std;/*解法:开设状态dp[i][j]表示田忌出了 阅读全文
摘要:
这题题意在代码中有解释, 求的最优值初看不太好理解. 求的是给定一个决策下的找到房子的最优期望值. 那么这题其实要做的就是一件事那就是给所有的分叉口的选择拍一个次序出来.根据这个次序我们就能够给出这只蜗牛在碰到有所情况下的唯一的一条爬行路线. 题目就是当我们安排好这样的这个次序后, 假设房子在各个叶子节点时, 需要走的路径总长最小. 这里的每一棵子树, 在枚举的过程中总是充当着不同的角色, 当枚举到的房子在自己的子树中时, 其要考虑能够安排最快的路径让蜗牛找到. 当没有在自己的子树时又不想让其放在前面让蜗牛白忙活一场. 所以综合一看, 貌似是一个很复杂的问题. 但是这题就是在如何安排子节点访问 阅读全文
摘要:
由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态数,让状态能够表示是从1还是从0转移过来的.(这题有个解法是采用多进制的状态压缩). 网上瞄了别人的一眼解题报告. 瞬间顿悟,竟然三层之间发生关系,那么就直接把连续的两层记录起来,虽然说空间上不及多进制优美. 但是却能够去描述这些个问题.代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#incl 阅读全文
摘要:
#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#define MOD 100000000using namespace std;/*题意:给定一个矩阵,这个矩阵表示了一块土地,给定的数据只有0,1, 表示土地肥沃与否. 其中0代表不肥沃,1代表肥沃. 不肥沃的地方是不能够种植玉米的,还有一个约束就是 不能够在相邻的1种植玉米. 现在问一共有多少种种植方式. 解法:明显的状态压缩题,先dfs出一行的非 阅读全文
摘要:
这题要考虑锤子移动到网格外部的情况,否则WA,处理的方式就是行和列同时增加5(最大距离).详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>using namespace std;/*题意:给定一个N*N的矩阵, 然后在这个矩阵的每个格子在任意时间会出现一个鼹鼠,这个出现 出现鼹鼠的时间是输出信息所确定的. 现在你手里有一把锤子能够去锤这些鼹鼠. 你能 够移动锤子,移动的两点之间的距离不能超过 阅读全文
摘要:
详见代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <iostream>#define INF 0x3f3f3f3f#define MAXN 1000005using namespace std;/*题意:给定N个柱子,现在要在这N个柱子之间摇摆,直至到达最右端的那一个柱子,问最少要 摇摆多少次. 摇摆的时机是在开始的时候或者是从某一点摇摆到某个对称的点时,保 证所有的柱 阅读全文
摘要:
详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;int N, M, dp[505][505];int row[505][505], col[505][505];/*题意:给定一个矩阵,矩阵中的每一个点都有两种矿产,A矿产只能够运送到上面去,B矿产只能 够运送到左边去,现在要在每个点都设置一个传送带传送带共有两种,一种是往上,一种 是往左,每个格子只能够 阅读全文
摘要:
题意:给定一个矩形,现在给出这个矩形中某些点存在柿子树,问在一个长和宽限定的子矩形内最多有多少个柿子树.解法:由于此题中数据量不大.直接树状数组统计然后暴力.代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, R, C, dx, dy;int tr[105][105];inline int lowbit(int x) { return x & 阅读全文
摘要:
前面自己写的动态方程转移出现了问题,还是没有考虑周全.AC代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;/*题意:给定了一个字符串,问这个字符串,这个字符串是由a,b,c,...,a+N-1的字符集组成的 现在问使用使得该串成为一个回文串的最少花费是多少. 花费的定义如下: 对于每一个字符,给出添加这个字符和删除这个字符分别需要花费多少. 添加和删除 可 阅读全文
摘要:
插入排序: 时间复杂度O(n^2), 辅助存储空间O(1), 稳定排序插入排序#include <stdio.h>#include <stdlib.h>int A[10000];void insertsort(int a[], int p, int r) { int i, j; for (i = 2; i <= r; ++i) { a[0] = a[i]; // 作为元素的备份和起到监视哨的作用 for (j = i-1; a[0] < a[j]; --j) { a[j+1] = a[j]; } a... 阅读全文