题目链接

题目大意

在一个树阵中按一定走法取一些树,使和最大且被 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 解题报告的更多相关文章

  1. 洛谷 P4397 [JLOI2014]聪明的燕姿 / TOPOI 测验1315, 问题E: 1935: 聪明的燕姿 解题报告

    题目链接 : 1. 洛谷 2.topoi . 大致题意:输入一个数s,找出所有约数和为s的数 关于一个数的约数和求法: 一个>1的整数可以被分解为多个 质数 的乘方,设数 s = p1k1 *  ...

  2. Topoi 测验1301, 问题C: 1959: 解题 解题报告

    Topoi(一个经常会炸的网站) 本题提交链接 很久以前的题目了, 刚开了博客,来写一波题解 先看一波提交记录: 调了好几天QAQ 唉! 要是这些高手里有我估计直接 输出1 就AC了 算法 DFS + ...

  3. $CF41D\ Pawn$

    \(problem\) 与这题 灰常的相似 然后内存可能过大 开个滚动数组 因为数塔问题总是 只需要上面一行的两个状态(这题就是数塔问题) 下面的代码与原题不符.(原题要输出路径)想抄的可以走了 输出 ...

  4. SCOJ4427 / TOPOI 4404: Miss Zhao's Graph 解题报告

    题目链接 SCOJ TOPOI 题目描述 Problem 给定一个包含n个顶点m条边的带权有向图,找一条边数最多的路径,且路径上的边的权值严格递增.图中可能有重边和自环. Input Data 第一行 ...

  5. 2018.10.05 TOPOI提高组模拟赛 解题报告

    得分: \(100+5+100=205\)(真的是出乎意料) \(T1\):抵制克苏恩(点此看题面) 原题: [BZOJ4832][Lydsy1704月赛] 抵制克苏恩 应该还是一个比较简单的\(DP ...

  6. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

  7. poj分类

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  8. 转载 ACM训练计划

    leetcode代码 利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode. ...

  9. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

随机推荐

  1. Excel文本获取拼音

    [说明] 版本:Excel 2010 文件后缀:.xls 有在.xlsb文件下使用未成功.建议使用.xls后缀. 1.调出“开发工具” 步骤:文件-->选项-->自定义功能区-->勾 ...

  2. poj 1845 Sumdiv(约数和,乘法逆元)

    题目: 求AB的正约数之和. 输入: A,B(0<=A,B<=5*107) 输出: 一个整数,AB的正约数之和 mod 9901. 思路: 根据正整数唯一分解定理,若一个正整数表示为:A= ...

  3. “Hello World”—— 第一个汇编程序

    Hello World这是每一门编程语言的第一个最简单程序,下面那个程序就是汇编语言的Hello World.学汇编一段时间了,到现在才记录下自己的第一个汇编程序笔记.虽然这是个相当简单的小程序,但这 ...

  4. [转]七个对我最好的职业建议(精简版)--Nicholas C. Zakas

    一.不要别人点什么,就做什么 我的第一份工作,只干了8个月,那家公司就倒闭了.我问经理,接下来我该怎么办,他说: "小伙子,千万不要当一个被人点菜的厨师,别人点什么,你就烧什么.不要接受那样 ...

  5. NetScaler VPX在Azure上的部署(二)

    本文是Citrix的工程师协助完成.主要是Citrix的VPX的配置. 导入License   进入NetScaler 中点击管理许可   导入后将有提示,请确认重启.   配置Azure HA 由于 ...

  6. 通过设置swift中container的ACL提供匿名访问及用户授权读取服务

    在上层使用swift提供的云存储服务的过程中,提出了无需验证的使用需求. 在参考了:http://my.oschina.net/alanlqc/blog/160196(curl命令操作) 官方文档: ...

  7. 如何将OpenTSDB源码导入eclipse

    OpenTSDB的官网上介绍了如何将OpenTSDB源码导入eclipse,官方链接,但步骤超级繁琐,还有一个简便方法,下面以导入OpenTSDB2.0.0为例. 1. 下载OpenTSDB2.0.0 ...

  8. 阻止文件不被上传到iCloud

    转自:http://blog.csdn.net/a921800467b/article/details/38386787 http://www.cocoachina.com/bbs/read.php? ...

  9. Python函数(十二)-迭代器

    字符串,列表,元组,字典,集合,生成器这些能通过for循环来遍历的数据类型都是可迭代对象 可通过isinstance判断是不是可迭代对象 >>> from collections i ...

  10. C语言学习笔记--接续符和转义符

    1.C语言中的接续符 (1)编译器将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行 (2)在接续单词时,反斜杠之后不能有空格,反斜杠下一行之前也不能有空格 (3)接续符适合在宏定义代码块时使用 #i ...