题目利用DP思想,dp[i][j][k]表示robot跑到ij列目前移动方向为k时,所需要的最小的flip。其中0 <= i <= N0 <= j <= Mk = right/down

dp[i][j][right] 可由dp[i][j-1][right]右移和dp[i-1][j][down]下移两种情况得到:

1. dp[i][j-1][right]右移一步,到dp[i][j][right],若maze[i][j] == 'b',则dp[i][j][right]=dp[i][j-1][right] +1;

2. dp[i-1][j][down]下移时,需要改变方向,先下移一步到第i行j列,此时方向是向下的,要变为向右,需考虑maze[i+1][j],若i+1==n(边界)或者maze[i+1][j] == 'b',则表示向下行不通,便直接改变方向向右;若第i+1行j列可以走的话,需将其变为'b',使其行不通,才能改变方向为向右。故可表示为以下公式:

dp[i][j][right] = min(dp[i][j-1][right], dp[i-1][j][down] + (i+1 < n && maze[i+1][j] != 'b')) + (maze[i][j] == 'b');

dp[i][j][down]同理如下;

dp[i][j][down] = min(dp[i-1][j][down], dp[i][j-1][right] + (j+1 < m && maze[i][j+1] != 'b')) + (maze[i][j] == 'b');

#include <iostream>
#include <vector>
#include <algorithm>
#include<map>
#include<vector>
#include<queue>
#include<string>
#include<set>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstring>
//#pragma warning(disable:4996)
using namespace std;
#define MAXN 50001
#define INF INT_MAX
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define L(a) ((a)<<1)
#define R(a) (((a)<<1)+1)
int n, m;
int dp[105][105][2];
char a[105][105];
int cal() {
//0表示right ,1 表示down
dp[0][0][0] = (a[0][0] == 'b');
dp[0][0][1] = dp[0][0][0] + (1 < m&&a[0][1] != 'b');
for (int i = 1; i < n; ++i) {
dp[i][0][1] = min(dp[i - 1][0][0] + (1 < m&&a[i - 1][1] != 'b'), dp[i - 1][0][1]) + (a[i][0] == 'b');
dp[i][0][0] = dp[i][0][1] + (i + 1 < n&&a[i + 1][0] != 'b');
}
for (int i = 1; i < m; ++i) {
dp[0][i][0] = min(dp[0][i - 1][0], dp[0][i - 1][1] + (1 < m&&a[1][i - 1] != 'b')) + (a[0][i] == 'b');
dp[0][i][1] = dp[0][i][0] + (i + 1 < m&&a[0][i + 1] != 'b');
}
for (int i = 1; i < n; ++i) {
for (int j = 1; j < m; ++j) {
dp[i][j][0] = min(dp[i][j - 1][0], dp[i - 1][j][1] + (i + 1 < n && a[i + 1][j] != 'b')) + (a[i][j] == 'b');
dp[i][j][1] = min(dp[i - 1][j][1], dp[i][j - 1][0] + (j + 1 < m && a[i][j + 1] != 'b')) + (a[i][j] == 'b');
}
}
return min(dp[n - 1][m - 1][0], dp[n - 1][m - 1][1]);
}
int main()
{
while (cin >> n >> m) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> a[i][j];
}
}
cout << cal() << endl;
}
return 0;
}

hihocoder 1290 DP的更多相关文章

  1. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)

    http://hihocoder.com/problemset/problem/1290 这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试 ...

  2. hihocoder #1290 : Demo Day

    传送门 #1290 : Demo Day 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You work as an intern at a robotics star ...

  3. CSU 1290 DP解决数学期望问题

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1290 题目大意: 给定k个数,每次可以生成0-N-1中的任何一个数,k个数中出现不同的整 ...

  4. hihocoder #1290 : Demo Day (2016微软编程测试第三题)

    #1290 : Demo Day 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You work as an intern at a robotics startup. ...

  5. hihocoder 1580 dp最大子矩阵和

    题意: 给出n*m的矩阵求最大子矩阵和,要求必须把矩阵中的某一个元素替换成p 代码: //求最大子矩阵和,容易想到压缩之后dp但是这道题要求必须替换一次p,必然优先替换最小的. //这样如果求得的结果 ...

  6. XDOJ

    1000.a+b. #include<bits/stdc++.h> using namespace std; int a,b; int main() { ios::sync_with_st ...

  7. hihoCoder 1043 完全背包 (dp)

    http://hihocoder.com/problemset/problem/1043 动态转移方程 :for v=cost..V f[v]=max(f[v],f[v-c[i]]+w[i]); #i ...

  8. hihocoder #1300 : 展胜地的鲤鱼旗 dp

    题目链接: http://hihocoder.com/problemset/problem/1300 题解: 先用栈预处理出每个‘)’匹配的‘(’的位子,放在pos数组中. dp[i]表示以i结尾的合 ...

  9. hihocoder #1301 : 筑地市场 数位dp+二分

    题目链接: http://hihocoder.com/problemset/problem/1301?sid=804672 题解: 二分答案,每次判断用数位dp做. #include<iostr ...

  10. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

随机推荐

  1. Java配置线程池

    一.Java配置线程池 1.线程池分类.其他 1.1.分类 IO密集型 和 CPU密集型 任务的特点不同,因此针对不同类型的任务,选择不同类型的线程池可以获得更好的性能表现. 1.1. IO密集型任务 ...

  2. RSA 加密解密

    from Crypto.Util.number import bytes_to_long, long_to_bytes, getPrime import libnum # 一.取两个素数 p = ge ...

  3. 【AGC】Connect API报错submit failed的相关问题

    ​[关键字] AGC.Connect API.Publishing API [问题描述] 开发者反馈在使用AGC的Connect API提交发布时,报出了[cds]submit failed, add ...

  4. 带你彻底掌握Bean的生命周期

    摘要:我们将深入研究Spring Framework的核心部分--Spring Bean的生命周期. 本文分享自华为云社区<Spring高手之路5--彻底掌握Bean的生命周期>,作者: ...

  5. mysql截取函数,拼接函数,大写函数例子

    题目:这题目是牛客网sql题,因为牵扯到3个函数,都是自己没怎么用过的,所以记录一下. 答案:是别人的解题思路 可以看出在mysql中提供的函数可以供我们使用来操作字段,非常的方便

  6. Lamada List 去重及其它操作示例

    import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util. ...

  7. Prometheus-3:一文详解promQL

    读前提示: 本文字数较多且紧凑,最好预留15min一次性看完,好营养,易吸收. promQL详解 Prometheus提供了内置的数据查询语言PromQL(全称为Prometheus Query La ...

  8. 一文帮你搞定H5、小程序、Taro长列表曝光埋点

    对于很多前端同学来说,"埋点"常常是一个不愿面对却又无法逃避的话题.为什么这么说呢,相信很多前端同学都深有体会:首先埋点这个事基本是前端"独享"的,服务端基本不 ...

  9. EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe

    EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe 使用EF的Code First迁移可以用于从Visual Studio内部更新数据库,但也可通过 ...

  10. jquery中for循环一共几种

    $.each()  第一个参数是循环的对象 , 第二个参数对对象中的每一个元素 执行 function函数 ,function 的第一个参数 i 是索引,item 是 循环对象中的每一个元素.