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]) + ...
随机推荐
- 【SQL Server】SQL触发器经验详解
[SQL Server]SQL触发器经验详解 | 浏览: 4314 | 更新: 2013-01-07 15:33 25 11 全文阅读分步阅读 加入杂志 步骤 1 2 3 4 5 6 7 8 ...
- Area of Polycubes
http://poj.org/problem?id=3792 题意:给出n个小正方体的中心坐标,求构成的多重小立方体的表面积.要求输入的下一个小正方体必须与之前的正方体有一个面是相交的.如果不满足条件 ...
- 0619-dedeCMS数据表
CMS的层级从前台分主要分为首页--栏目页--内容页,从后台分主要是四张表之间的关系: 1.模型表--dede_channeltype(顶级) 2.栏目表--dede_arctype 3.数据表:分为 ...
- Codeforces 792D
题意:给定一棵拥有n个节点的满二叉树(即n==2^x-1),q个查询,每次给出一个节点的编号,再给出一个由L,R,U组成的字符串序列,依次表示向左子节点.右子节点.父节点移动,如果移动不合法,则忽略. ...
- Select2插件ajax方式加载数据并刷新页面数据回显
今天在优化项目当中,有个要在下拉框中搜索数据的需求:最后选择使用selec2进行开发: 官网:http://select2.github.io/ 演示: 准备工作: 文件需要引入select2.ful ...
- wordpress登录账号之后才能查看页面,实例
函数: <?php auth_redirect(); ?> 例子: 要求用户登录才能查看页面 if(!is_user_logged_in()){ auth_redirect(); } 源文 ...
- 关于华为手机Log.d打印不出来log的问题
http://blog.csdn.net/picasso_l/article/details/52489560 拨号,进入后台设置,进行操作.
- git——merge和rebase的区别
参考http://www.jianshu.com/p/129e721adc6e 我在公司里看到其他同事都使用git pull --rebase拉取远程代码,而我总是用git pull,也有同事和我说过 ...
- 实验2 C++数组与指针
一.实验目的: 掌握一维数组和二维数组的定义.赋值和输入输出的方法. 掌握字符数组和字符串函数的使用. 通过实验进一步掌握指针的概念,会定义和使用指针变量. 能正确使用数组的指针和指向数组的指针变量. ...
- CI框架3.x 之实现前后端分离
一.建立合理的目录结构 admin与home为后台和前台的控制器和模板文件夹 二.定义前后台视图路径常量 在constants.php中添加如下代码: //定义前台视图路径常量 define('HOM ...