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的更多相关文章

  1. bupt summer training for 16 #8 ——字符串处理

    https://vjudge.net/contest/175596#overview A.设第i次出现的位置左右端点分别为Li,Ri 初始化L0 = 0,则有ans = sum{ (L[i] - L[ ...

  2. bupt summer training for 16 #6 ——图论

    https://vjudge.net/contest/174020 A.100条双向边,每个点最少连2个边 所以最多100个点,点的标号需要离散化 然后要求恰好经过n条路径 快速幂,乘法过程就是flo ...

  3. 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 ...

  4. bupt summer training for 16 #4 ——数论

    https://vjudge.net/contest/173277#overview A.平方差公式后变为 n = (x + y)(x - y) 令 t = x - y ,变成 n = (t + 2x ...

  5. bupt summer training for 16 #3 ——构造

    https://vjudge.net/contest/172464 后来补题发现这场做的可真他妈傻逼 A.签到傻逼题,自己分情况 #include <cstdio> #include &l ...

  6. bupt summer training for 16 #2 ——计算几何

    https://vjudge.net/contest/171368#overview A.一个签到题,用叉积来判断一个点在一条线的哪个方向 可以二分,数据范围允许暴力 #include <cst ...

  7. bupt summer training for 16 #1 ——简单题目

    D.What a Mess 给n个数,求其中能满足 a[i] % a[j] == 0 的数对之和 n = 1W,max_ai = 100W 不是很大,所以就直接筛就可以了 计算可得最高复杂度 < ...

  8. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配

    ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...

  9. 记忆化搜索(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]) + ...

随机推荐

  1. luogu 1045 麦森数

    题目大意: 从文件中输入P(1000<P<3100000),计算2^P−1的位数和最后500位数字(用十进制高精度数表示) 思路: 一道高精度练习题 其中位数是一个结论 位数=[P*log ...

  2. PCB 钻孔补偿那点事

    没有优秀的个人,只有优秀的团队,在团队共同的协作下,PCB CAM自动化[net处理]与[钻孔处理] 第一阶段开发项完成了,,后续工作可以转向PCB规则引擎开发了.这里说说PCB工程钻孔补偿的那点事, ...

  3. PCB SQL SERVER 字段模糊匹配个数 实现方法

    今天工程系统给到加投加投组件的数据规则修改,遇到需将一个字段模糊匹配的个数统计 这类需求要平时应该很少遇到了,这里将此方法分享出来, 一.需求如下 例子:itempara字段中的内容是: IVH板 铜 ...

  4. E20170925-hm

    arc  n. 综合症状; 弧(度); 天穹; 电弧,弧光.; vi. 形成拱状物; 循弧线行进; wrap  vt. 包; 缠绕; 用…包裹(或包扎.覆盖等); 掩护;            n. ...

  5. redis-数据结构以及使用场景分析

    目录 redis 常见数据结构以及使用场景分析 key String Hash List Set Sorted Set Bitmap和HyperLogLog Pub/Sub redis 常见数据结构以 ...

  6. Codeforces 455D 分块+链表

    题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...

  7. BZOJ 4811 树链剖分+线段树

    思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...

  8. 【BZOJ1939】[Croatian2010] Zuma(动态规划)

    题目: BZOJ1939(权限题) 分析: 这题很容易看出是DP,但是状态和转移都不是很好想-- 用\(dp[l][r][c]\)表示在\(l\)前面已经新加了\(c\)个和\(l\)一样的弹子时,使 ...

  9. 阿里邮箱绑定Foxmail失败的解决办法

    收件服务器地址: POP 服务器地址:pop3.mxhichina.com 端口110,SSL 加密端口995 或 IMAP 服务器地址:imap.mxhichina.com 端口143,SSL 加密 ...

  10. [转]Android的userlogin登录

    本文转自:http://hteqc6o.blog.sohu.com/199334086.html 用户注册 1.首先,先画你想要编译出的界面 根据草图,仅仅使用linearLayout的布局是不够的, ...