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]) + ...
随机推荐
- luoguP2939 [USACO09FEB]改造路Revamping Trails
约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路. ...
- C++11系列-什么是C++11
什么是C++0x? C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性.在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编 ...
- JSP-Runoob:Cookie 处理
ylbtech-JSP-Runoob:Cookie 处理 1.返回顶部 1. JSP Cookie 处理 Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JS ...
- Scala快速统计文件中特定单词,字符的个数
val fileContent=Source.fromFile("/home/soyo/桌面/ss5.txt").getLines.mkString(",") ...
- Docker为什么刚运行就退出了
引言 最近群里的好多新接触Docker的朋友,好多都遇到了相同的问题,使用 $ docker run -d ubuntu /bin/bash 运行了一个简单的容器后,然后docker ps -a 进行 ...
- PCB Genesis 无需启动Xmanager图形窗口运行脚本 实现方法
从事PCB工程行业的都知道,启动Genesis需2个exe程序(Xmanager.exe与get.exe)需一起启动才可以打开我们熟悉的软件, 而Xmanager是图形窗口是给用户UI交互使用的,如果 ...
- Linux系统下vim常用快捷键及功能
1. 什么是vim Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在vi的基础上改进和增加了很多特性. vim编辑器是Linux系统下标准的编辑器,作用相当于windows系统中的记 ...
- P2420 让我们异或吧(倍增)
题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...
- C语言过时了?为什么还要推荐每一位程序员都来学一下C语言?
互联网蓬勃发展的时代,有一类人做出了巨大的贡献,这一群人被大家称之为程序员,怎样才能成为一名优秀的程序员呢,为什么每一个程序员都需要学习C语言呢? 就让我来跟大家分享分享: 在学习C/C++或者想 ...
- Wannafly挑战赛19 A-队列Q
题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi 表示.Q1 表示队头元素,QN 表示队尾元素.队列中的元素是 N 的一个全排列. ZZT 需要在这个队 ...