bupt summer training for 16 #7 ——搜索与DP
https://vjudge.net/contest/174962#overview
A.我们发现重点在于x,y只要累加就ok了
在每个x上只有上下两种状态,所以可以记忆化搜索
f[0/1][i]表示 x = i 时向下/上走,那需要移动多少才能走出去
#include <cstdio>
#include <algorithm> using namespace std; const int maxn = ; typedef long long ll; ll a[maxn], f[][maxn]; int n, b[][maxn], vis[][maxn]; ll dfs(int i, int k, ll d = ) {
if(vis[k][i]) {
b[k][i] = -;
return f[k][i] = ;
}
vis[k][i] = ;
if(!f[k][i]) {
int y = i + (k ? a[i] : -a[i]);
if(y > n || y <= ) d = ;
else d = dfs(y, k ^ );
f[k][i] = d + a[i];
if(y >= && y <= n && b[k ^ ][y]) b[k][i] = -;
}
vis[k][i] = ;
return f[k][i];
} int main() {
scanf("%d", &n);
for(int i = ;i <= n;i ++)
scanf("%I64d", &a[i]);
b[][] = b[][] = -;
for(int i = ;i <= n;i ++)
dfs(i, ), dfs(i, );
for(int i = ;i < n;i ++) {
if(b[][ + i]) puts("-1");
else printf("%I64d\n", i + f[][ + i]);
}
return ;
}
写狗了又RE又T又WA的...写的丑陋,我。无法忍受
B.非常无脑的爆搜,效率玄学
数据范围个位数还是可以大胆以下的
#include <cstdio>
#include <algorithm> using namespace std; const int xx[] = {-, , , };
const int yy[] = {, , , -}; int n, m, k; char s[][]; bool vis[][]; bool dfs(const int &x, const int &y, const int &cc) {
if(cc == k) return ;
int nx, ny;
for(int i = ;i < ;i ++) {
nx = x + xx[i], ny = y + yy[i];
if(nx > && nx <= n && ny > && ny <= m && s[nx][ny] != 'S' && !vis[nx][ny]) {
vis[nx][ny] = ;
if(dfs(nx, ny, cc + )) return ;
vis[nx][ny] = ;
}
}
return ;
} int main() {
while(scanf("%d %d", &n, &m), n!= ) {
k = ;
for(int i = ;i <= n;i ++) {
scanf("%s", s[i] + );
for(int j = ;j <= m;j ++)
vis[i][j] = , k += (s[i][j] != 'S');
}
vis[][] = ;
puts(dfs(, , ) ? "YES" : "NO");
}
return ;
}
C.显而易见的树型DP,依旧写的很糟...
f[i][j]表示从节点 i 向下走距离 j 能获得的最大价值
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm> using namespace std; int n, m, s, a[], f[][], g[][]; vector <pair<int,int> > e[]; void dfs(int u, int fa) {
int v, w, i;
for(i = ;i <= m;i ++) g[u][i] = ;
for(i = ;i < e[u].size();i ++) {
v = e[u][i].first;
if(v == fa) continue;
w = e[u][i].second;
dfs(v, u);
for(int j = m;j >= ;j --)
for(int k = j;k >= ;k --)
if(j - k - w >= )
f[u][j] = max(f[u][j], g[u][k] + f[v][j - k - w]);
for(int j = ;j <= m;j ++)
g[u][j] = f[u][j];
}
for(i = ;i <= m;i ++) f[u][i] += a[u];
} int main() {
while(~scanf("%d", &n)) {
memset(f, , sizeof f);
memset(g, , sizeof g);
memset(e, , sizeof e);
for(int i = ;i <= n;i ++)
scanf("%d", &a[i]);
for(int u, v, w, i = ;i < n;i ++) {
scanf("%d %d %d", &u, &v, &w);
e[u].push_back(make_pair(v, w));
e[v].push_back(make_pair(u, w));
}
scanf("%d %d", &s, &m), m /= ;
dfs(s, s);
printf("%d\n", f[s][m]);
}
return ;
}
D.大家都会写大龙虾算法让我有些惶恐...
于是决定抄一发队友的dlx板子
bupt summer training for 16 #7 ——搜索与DP的更多相关文章
- bupt summer training for 16 #8 ——字符串处理
https://vjudge.net/contest/175596#overview A.设第i次出现的位置左右端点分别为Li,Ri 初始化L0 = 0,则有ans = sum{ (L[i] - L[ ...
- bupt summer training for 16 #6 ——图论
https://vjudge.net/contest/174020 A.100条双向边,每个点最少连2个边 所以最多100个点,点的标号需要离散化 然后要求恰好经过n条路径 快速幂,乘法过程就是flo ...
- bupt summer training for 16 #5 ——数据结构
https://vjudge.net/contest/173780 A.假设 Pt = i,则由Ppi = i得 Ppt = t = Pi 所以就有 if Pt = i then Pi = t #in ...
- bupt summer training for 16 #4 ——数论
https://vjudge.net/contest/173277#overview A.平方差公式后变为 n = (x + y)(x - y) 令 t = x - y ,变成 n = (t + 2x ...
- bupt summer training for 16 #3 ——构造
https://vjudge.net/contest/172464 后来补题发现这场做的可真他妈傻逼 A.签到傻逼题,自己分情况 #include <cstdio> #include &l ...
- bupt summer training for 16 #2 ——计算几何
https://vjudge.net/contest/171368#overview A.一个签到题,用叉积来判断一个点在一条线的哪个方向 可以二分,数据范围允许暴力 #include <cst ...
- bupt summer training for 16 #1 ——简单题目
D.What a Mess 给n个数,求其中能满足 a[i] % a[j] == 0 的数对之和 n = 1W,max_ai = 100W 不是很大,所以就直接筛就可以了 计算可得最高复杂度 < ...
- ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
随机推荐
- tab不显示为空格
- A. Power Consumption Calculation
http://codeforces.com/problemset/problem/10/A 题很简单,就是题意难懂啊... #include <stdio.h> #include < ...
- thinkphp vender
vender在thinkphp里面时引入系统的类库的意思,具体用法如下. Vendor('Classes.PHPExcel');表示引入vendor目录下的classes文件夹下面的phpexcel文 ...
- Gym - 101982A 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) A. Exam
题面 题意:你和朋友一起做了n道判断题,现在你知道你们两的答案,也知道你朋友对了k个,问你至少对了几个 题解:假设你和朋友n个答案都一样,那你是不是也对了k个,假设你和朋友有1个答案不一样,是不是,你 ...
- [Swift通天遁地]九、拔剑吧-(10)快速创建美观的聊天界面:可发送文字、表情、图片
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- asp.net MVC ajax 请求参数前台加密后台解密
最近有一个需求要求页面查询数据库,查询内容保存到excel里面作为附件加密打包下载.查询的sql作为参数传入后台,实现加密提交.这里做个记录,后面用到直接来拿. 控制器 public ActionRe ...
- mac 安装 swoole 可能会出现的错误
请先看完之后再操作 一.用pecl安装swoole(没有安装起来) 2018年4月,由于homebrew的变动,导致无法使用brew install的方式安装php的扩展,现在改为用pecl安装,pe ...
- day24 03 多继承
day24 03 多继承 正常的代码中 单继承==减少了代码的重复 继承表达的是一种 子类是父类的关系 1.简单的多继承关系 A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子 ...
- hcode视频教程中心(学习h5和hbuilder等)
网站: http://www.hcoder.net/course
- SRM-697-DIV2
Div2 Medium: DivisibleSetDiv2 Problem Statement You are given a vector <int> b containing ...