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 ...
随机推荐
- nginx高级-前端必会
需要设置的几个参数: 基本配置文件 user www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; ...
- Android饼图的简单实现
1.简单的实现效果图: 2.自定义View的实现 package myapplication.com.myapp.view; import android.content.Context; impor ...
- HDU 3763 CD【二分查找】
解题思路:给出两个数列an,bn,求an和bn中相同元素的个数因为注意到n的取值是0到1000000,所以可以用二分查找来做,因为题目中给出的an,bn,已经是单调递增的,所以不用排序了,对于输入的每 ...
- POJ 1458 Common Subsequence 【最长公共子序列】
解题思路:先注意到序列和串的区别,序列不需要连续,而串是需要连续的,先由样例abcfbc abfcab画一个表格分析,用dp[i][j]储存当比较到s1[i],s2[j]时最长公共子序 ...
- Kattis - bela
Bela Young Mirko is a smart, but mischievous boy who often wanders around parks looking for new idea ...
- C# 基础复习 四 多线程
单线程和多线程的区别 单线程: 只用主线程处理,如果一个操作在占用主线程,那么其他操作则无法执行 多线程: 除了主线程外,还开启了子线程来执行操作,子线 ...
- [置顶]
智能家居开源项目 The open Home Automation Bus (openHAB)
================================================================================ 2014-05-19 论文的事情太多, ...
- 利用after和before伪类实现chrome浏览器tab选项卡斜边纯css无图制作笔记
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- rest-framework框架
rest-framework框架是Django里面非常重要的框架,但提到rest-framework框架就不得不说两种请求方式,那就是CBV和FBV. FBV(function base views) ...
- Python中的itertools.product
例子1:import itertoolsa = itertools.product([1,2,3],[100,200])print(a)for item in itertools.product([1 ...