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]) + ...
随机推荐
- luogu 1045 麦森数
题目大意: 从文件中输入P(1000<P<3100000),计算2^P−1的位数和最后500位数字(用十进制高精度数表示) 思路: 一道高精度练习题 其中位数是一个结论 位数=[P*log ...
- bzoj4082
贪心+倍增 首先如果这个问题在序列上,好像可以按右端点排序,然后从起点开始向能到的最远的地方走. 但是环上不可以,因为随即一个起点可能不是最小的. 然后神思路来了:我们先将环展开倍增,再将区间按右端点 ...
- Linux下sublime 无法输入中文的解决
个人认为linux下的编辑器,对于小白来说,最好用的就是sublime了,但是,安装之后敲代码无法输入中文 ,很尴尬. 百度后,发现了解决方法. 项目链接:https://github.com/lyf ...
- Java Socket编程 深入讲解?你之前真的学懂了吗
很多人学习Socket往往会碰到这样哪样的问题,可以看看下面,加深理解.能看懂多少看懂多少. Socket是Java网络编程的基础,了解还是有好处的,这篇文章主要讲解Socket的基础编程.Socke ...
- javascript 处理链接的多种方式
在页面中的链接除了常规的方式以外,如果使用javascript,还有很多种方式,下面是一些使用javascript,打开链接的几种方式: 1.使用window的open方法打开链接,这里可是在制定页面 ...
- C#语言最基础的认识变量
变量是指一块存储数据的内存空间,并且该内存区域的数据内容可以发生变化. 变量是必须先声明后赋值. 基本的语法:数据类型+变量名: 变量名=数据: 简单的使用技巧:声明赋值简写 Static void ...
- vue-clickoutside d
js文件 export default { bind(el, binding, vnode) { function documentHandler(e) { if (el.contains(e.tar ...
- 关于编辑器对<input>标签报错提示“表单输入没有相关label”的问题
相信很多朋友在制作表单的时候,我们的编辑器会有下图的相关提示吧 我们发现虽然这样并不影响我们的正常使用,但是看着这样的报错提示总是很让人心烦,那么这到底是为什么呢? 其实,这是因为编辑器建议我们在使用 ...
- php域名授权实现方法
php域名授权实现方法 域名授权的目的:维护知识产权. php实现域名授权有很多方法,比如: 1.本地验证法. 2.在线验证法. 不管是那种方法,其实原理都是一样的. 今天我就举一个本地验证的例子! ...
- oracle for linux服务器磁盘空间不足,通过过期的文件释放磁盘空间
--2013-09-16截取的数据-- 使用df-h命令查看系统磁盘空间 [root@erpdbs PROD]# df -h Filesystem Size Used Avail Use% Mount ...