hiho150周 - 动态规划*
一个n*m的迷宫由‘.’和'b'组成,从(1,1)走到(n,m),只能向右或者向下走,但遇到‘b’时才能改变方向,开始时方向向右。
问到达(n,m)至少改变几个位置上的值
/***********************************************************/
原来转移方程也可以这么优美
每个方格有两个状态,向右和向下
这两个状态均由左边和上边的两个方格四个状态转移得来
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
#define RIGHT 0
#define DOWN 1 const int N = ;
char maze[N][N];
int dp[N][N][]; int main(){
int n,m;
cin>>n>>m;
for(int i=;i<n;i++) cin>>maze[i];
for(int i=;i<n;i++) maze[i][m] = 'b';
for(int j=;j<m;j++) maze[n][j] = 'b'; dp[][][] = (maze[][]=='b');
dp[][][] = (maze[][]=='b')+(maze[][]!='b');
for(int i=;i<n;i++) for(int j=;j<m;j++){
if(!(i+j)) continue;
dp[i][j][] = dp[i][j][] = OO;
if(j->=){
dp[i][j][] = MIN(dp[i][j-][],dp[i][j-][]+(maze[i+][j-]!='b'));
dp[i][j][] = MIN(dp[i][j-][]+(maze[i][j+]!='b'),dp[i][j-][]+(maze[i+][j-]!='b')+(maze[i][j+]!='b'));
}
if(i->=){
dp[i][j][] = MIN(dp[i][j][],dp[i-][j][]+(maze[i-][j+]!='b')+(maze[i+][j]!='b'));
dp[i][j][] = MIN(dp[i][j][],dp[i-][j][]+(maze[i+][j]!='b'));
dp[i][j][] = MIN(dp[i][j][],dp[i-][j][]+(maze[i-][j+]!='b'));
dp[i][j][] = MIN(dp[i][j][],dp[i-][j][]);
}
dp[i][j][]+=(maze[i][j]!='.');
dp[i][j][]+=(maze[i][j]!='.');
} printf("%d\n",MIN(dp[n-][m-][],dp[n-][m-][]));
return ;
}
hiho150周 - 动态规划*的更多相关文章
- 第一周 动态规划Dynamic Programming(一)
一.概念 动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 1.试用情况: 2.解决步骤 ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- 集训第五周动态规划 I题 记忆化搜索
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 集训第五周动态规划 H题 回文串统计
Hrdv is interested in a string,especially the palindrome string.So he wants some palindrome string.A ...
- 集训第五周动态规划 G题 回文串
Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...
- 集训第五周动态规划 D题 LCS
Description In a few months the European Currency Union will become a reality. However, to join the ...
- 集训第五周动态规划 C题 编辑距离
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- 集训第五周 动态规划 B题LIS
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- hihocoder第212周-动态规划
题目链接 import java.util.Scanner; public class Main { long mod = (long) (1e9 + 7); int MAXN = 107; int ...
随机推荐
- NSPort与NSRunloop的关系是流与消息调度的关系
NSPort与NSRunloop的关系是流与消息调度的关系. NSPort 将流插入到消息调度队列: 相当于 Socket将流插入到应用一样 - (void)launchThread { NSPort ...
- 阿里logo库
http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2
- ZBrush软件特性之Marker标记调控板
在ZBrush®中使用Marker标记调控板来记忆物体属性,因此能在任何时间回到标记并使用它给其他物体或改变物体作为参考点. ZBrush软件下载:http://pan.baidu.com/s/1sl ...
- 前端精选文摘:css之BFC 神奇背后的原理(转载)
一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...
- day19-1 迭代器,三元表达式,列表推导式,字典生成式,
目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...
- luogu P3387 【模板】缩点_拓扑排序
还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...
- NotFoundHttpException
报错:NotFoundHttpException 这种一般都是路由配置错误
- BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...
- [读书笔记] Python数据分析 (四) 数组和矢量计算
Numpy:高性能计算和数学分析的基础包 ndarray, 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对数组数据进行快速运算的标准数学函数 用于读写磁盘数据的工具和用于操作内存 ...
- 【剑指offer】Q31:连续子数组的组大和
简短的分析见:http://blog.csdn.net/shiquxinkong/article/details/17934747 def FindGreatestSumOfSubArray(arra ...