ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
http://hihocoder.com/problemset/problem/1290
这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试了比较久才正确,不过好在是1A,但是最后只留了一个小时多一点给B题,也导致了B题最后也没能AC掉。首先状态是很好确定的p[i][j][k]表示走到第i行第j个格子时,方向是k的情况下的最小改变格子数目。(k from {0, 1})而且由于只有往下和往右走,所以中间过程进行转移时改变的格子不会影响后续过程中的转移,所以只需要分析p[i][j][0]和p[i][j][1]分别怎么由上面和左边的格子得到。情况比较多,基本上在代码里就可以看明白,不过需要对几处边界条件判断一下,比如第一列无法由左边格子得到,第一行无法由上面的格子得到,还有就是向下和向右撞到边界的时候。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#define LL long long using namespace std; int n, m;
char str[][];
int p[][][]; void input()
{
for (int i = ; i < n; ++i)
scanf("%s", str[i]);
memset(p, -, sizeof(p));
} void work()
{
int t;
if (str[][] == '.') p[][][] = ;
else p[][][] = ;
if (m == || str[][] == 'b') p[][][] = ;
else p[][][] = ;
for (int i = ; i < n; ++i)
{
for (int j = ; j < m; ++j)
{
if (i == && j == ) continue;
if (j == )
{
//left
if (i+ == n || str[i+][j] == 'b')
p[i][j][] = p[i-][j][];
else
p[i][j][] = p[i-][j][]+;
if (str[i][j] == 'b') p[i][j][]++; //bottom
p[i][j][] = p[i-][j][];
if (str[i][j] == 'b') p[i][j][]++;
}
else
{
//left
p[i][j][] = p[i][j-][];
if (str[i][j] == 'b') p[i][j][]++;
if (i > )
{
t = p[i-][j][];
if (str[i][j] == 'b') t++;
if (i+ == n || str[i+][j] == 'b')
p[i][j][] = min(p[i][j][], t);
else
p[i][j][] = min(p[i][j][], t+);
} //bottom
p[i][j][] = p[i][j-][];
if (str[i][j] == 'b') p[i][j][]++;
if (!(j+ == m || str[i][j+] == 'b'))
p[i][j][]++;
if (i > )
{
t= p[i-][j][];
if (str[i][j] == 'b') t++;
p[i][j][] = min(p[i][j][], t);
}
}
}
}
printf("%d\n", min(p[n-][m-][], p[n-][m-][]));
} int main()
{
//freopen("test.in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF)
{
input();
work();
}
return ;
}
ACM学习历程—Hihocoder 1290 Demo Day(动态规划)的更多相关文章
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- ACM学习历程—HDU2476 String painter(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...
- ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)
http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时 ...
- ACM学习历程—Hihocoder 1139 二分·二分答案(bfs)
http://hihocoder.com/problemset/problem/1139 这题提示上写的是二分,但是感觉不二分应该也可以,至少题目是AC的... 二分的思想就是二分答案的值,看能不能在 ...
- ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 && 排序 && 染色))
http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不 ...
- ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
http://hihocoder.com/problemset/problem/1288 这题是这次微软笔试的第一题,关键的是s的上限是min(w, h),这样s的范围只有到1000,这样就可以直接暴 ...
- ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)
hihoCoder挑战赛12 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There is a strange storehouse in PKU. In this ...
- ACM学习历程—Hihocoder 1164 随机斐波那契(数学递推)
时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). ...
- ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)
Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...
随机推荐
- Zabbix 监控tomcat web
个人博客:https://blog.sharedata.info/ 在zabbix监控web,web容器是tomcat 默认的端口是8080导致web监控失败!不能找到主机因此在修改tomcat 端口 ...
- html 自动跳转,meat(http-equiv)标签详解
http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变 ...
- LINQ分页工具
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- 【CodeM初赛B轮】A 贪心
[CodeM初赛B轮]A 题目大意:给你一棵树,起初所有点都是白色的,你每次都能选择一个白点i,将这个点i到根路径上的所有到i的距离<k[i]的点都染成黑色(根和i也算,已经被染成黑色的点还是黑 ...
- opengl绘制图片
#include <GL/glew.h>#include <glut.h>#include "FreeImage.h"#include <stdio. ...
- ABAP OO 开发语法整理
[转自 http://blog.csdn.net/saphome/article/details/6956933] 在类中,只能用TYPE 附加关键字指定数据类型. •TYPES: 一般的类型定义方法 ...
- Linux 下 Crontab 命令使用详解 定时任务
一. Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的运行. 1.1 /etc/crontab 文件 在/etc文件夹下有一个crontab文件,这里存放有系统运行的一 ...
- Django中日志管理
在settings中设置日志的相关信息,然后再逻辑代码区就可以保存相应的信息了 #简单设置: LOGGING = { 'version': 1, 'disable_existing_loggers': ...
- 2018svn1
Svn(Subversion) VisualSVN-Server是SVN的服务端.TortoiseSVN是客户端.D:\SVNRepositories是安装VisualSVN-Server时候选择的仓 ...
- golang 获取指定目录下的子文件列表
GO语言按照深度遍历文件 原创 2016年07月20日 09:45:19 标签: go语言 / 遍历 / string 1971 常规方法不使用pathfilepath包 go的filepath包 g ...