TOPOI 测验1320, 问题C: 4410: [CF41D]Pawn 解题报告
题目大意
在一个树阵中按一定走法取一些树,使和最大且被 k+1整除
解题思路
类似一个数塔问题
因为最后的结果要被 k+1 整除,所以可以记录到每一个点 对 k+1 取余结果不同的最优解(最大值),不用记录每一个数,浪费空间和时间
举个例子:
当到达 (i, j) 这个点时,有两种路线得到的值分别为a, b(a>b),且a % (k+1) = x, b % (k+1) = x,那么此时只需记录a,将b舍去
因为余数相同不会对后面的结果产生影响
最后枚举最后一行对 k+1取余结果为0的结果,取最大值
空间 n*m*k, 时间n*m*k
路径记录
再开两个数组分别记录每个最优解是由哪个状态转移而来的,输出时递归输出 递归过程
void print (int x, int y, int q) { // 递归到第x行,第y列,%(k+1) 的结果为q
if (x == n) printf ("%d\n", y);
else {
print (x + 1, y + ans[x][y][q].lr, ans[x][y][q].mod);
if (ans[x][y][q].lr == 1) putchar ('L');
else putchar ('R');
}
}
代码
#include <bits/stdc++.h>
using namespace std;
struct e {int lr, mod;} ans[105][105][15]; //ans记录每一步方向及 %k的余数
int n, m, k, a[105][105], f[105][105][15], w;
char ch;
void print (int x, int y, int q) { // 递归到第x行,第y列,%(k+1) 的结果为q
if (x == n) printf ("%d\n", y);
else {
print (x + 1, y + ans[x][y][q].lr, ans[x][y][q].mod);
if (ans[x][y][q].lr == 1) putchar ('L');
else putchar ('R');
}
}
int main(){
scanf ("%d %d %d", &n, &m, &k); k++;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) cin >> ch, a[i][j] = ch -'0';
memset (f, -1, sizeof (f));
for (int i = 1; i <= m; i++) f[n][i][a[n][i]%k] = a[n][i];
for (int i = n - 1; i; i--)
for (int j = 1; j <= m; j++)
for (int p = 0; p < k; p++) {
int t = (p + a[i][j]) % k;
if (j != 1 and f[i+1][j-1][p] >= 0)
f[i][j][t] = f[i+1][j-1][p] + a[i][j], ans[i][j][t] = (e) {-1, p};
if (j != m and f[i+1][j+1][p] >= 0 and f[i+1][j+1][p] + a[i][j] > f[i][j][t])
f[i][j][t] = f[i+1][j+1][p] + a[i][j], ans[i][j][t] = (e) {1, p};
}
for (int i = 1; i <= m; i++) if (f[1][i][0] > f[1][w][0]) w = i; //找到起始位置
if (!w) {puts("-1"); return 0;}
printf ("%d\n", f[1][w][0]);
print (1, w, 0);
return 0;
}
TOPOI 测验1320, 问题C: 4410: [CF41D]Pawn 解题报告的更多相关文章
- 洛谷 P4397 [JLOI2014]聪明的燕姿 / TOPOI 测验1315, 问题E: 1935: 聪明的燕姿 解题报告
题目链接 : 1. 洛谷 2.topoi . 大致题意:输入一个数s,找出所有约数和为s的数 关于一个数的约数和求法: 一个>1的整数可以被分解为多个 质数 的乘方,设数 s = p1k1 * ...
- Topoi 测验1301, 问题C: 1959: 解题 解题报告
Topoi(一个经常会炸的网站) 本题提交链接 很久以前的题目了, 刚开了博客,来写一波题解 先看一波提交记录: 调了好几天QAQ 唉! 要是这些高手里有我估计直接 输出1 就AC了 算法 DFS + ...
- $CF41D\ Pawn$
\(problem\) 与这题 灰常的相似 然后内存可能过大 开个滚动数组 因为数塔问题总是 只需要上面一行的两个状态(这题就是数塔问题) 下面的代码与原题不符.(原题要输出路径)想抄的可以走了 输出 ...
- SCOJ4427 / TOPOI 4404: Miss Zhao's Graph 解题报告
题目链接 SCOJ TOPOI 题目描述 Problem 给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增.图中可能有重边和自环. Input Data 第一行 ...
- 2018.10.05 TOPOI提高组模拟赛 解题报告
得分: \(100+5+100=205\)(真的是出乎意料) \(T1\):抵制克苏恩(点此看题面) 原题: [BZOJ4832][Lydsy1704月赛] 抵制克苏恩 应该还是一个比较简单的\(DP ...
- (转)POJ题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- poj分类
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 转载 ACM训练计划
leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode. ...
- POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)
本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...
随机推荐
- python中的yield关键字
yield关键字一直困扰了我很久,一直也没有弄明白,现在将暂时理解的yield记录如下,供参考: 关键词:可迭代对象,生成器,迭代器 一.可迭代对象: 可迭代对象:可迭代对象是一个泛称,只要可以用fo ...
- docker 安装与常用命令与常用容器(containers)环境
注意区别 container 与 image 的关系,container 的建立需要 image 的承载,也即 container 依赖 image,停止并删除了 container 并不会删除 im ...
- freeMarker(十二)——模板语言补充知识
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.特殊变量参考 特殊变量是由FreeMarker引擎自己定义的变量. ...
- bzoj1014火星人
...强迫症终于A了这道题 bzoj前30道全A指日可待 splay维护这个结点控制的字符串的hash值 每次旋转重新算一遍就可以了 查询的时候跑一个二分 讲起来很简单但是还是调了1h才调对了spl ...
- BZOJ5362: [Lydsy1805月赛]quailty 算法
BZOJ5362: [Lydsy1805月赛]quailty 算法 https://lydsy.com/JudgeOnline/problem.php?id=5362 分析: 题意即求一个最小基环树森 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- Linux编程之错误代码
头文件/usr/include/asm-generic/errno-base.h定义错误码: #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERI ...
- 【转】 Pro Android学习笔记(三二):Menu(3):Context菜单
目录(?)[-] 什么是Context menu 注册View带有Context menu 填Context菜单内容 Context菜单点击触发 什么是Context menu 在桌面电脑,我们都很熟 ...
- 【原】spring jar 下载
作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/8098965.html 1.进入官网 ...
- centos6.5安装zookeeper教程(三)
阅读前建议先阅读: http://www.cnblogs.com/duenboa/articles/6665159.html 1. 下载安装文件zookeeper-3.4.6.tar.gz 镜像地 ...