BOJ1293 小马过河 dp
2011-12-01 16:34
225 查看
题意:给一个矩阵。从上到下一样,(题目里说的是从下到上,但是其实一样)代码里面就是从上到下考虑。
每一行到下一行都只有三个选择,左下,下,右下。
所以转移方程为:
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+w[i][j];
因为dp还很不熟练。
刚看到题目的时候其实第一反应是类似广搜的去模拟一下差不多,反正每一格只会影响下一行的三格。
然后写的时候就注意到了其实就是dp。
每一行到下一行都只有三个选择,左下,下,右下。
所以转移方程为:
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+w[i][j];
因为dp还很不熟练。
刚看到题目的时候其实第一反应是类似广搜的去模拟一下差不多,反正每一格只会影响下一行的三格。
然后写的时候就注意到了其实就是dp。
#include<iostream> #define min(a,b) (a<b?a:b) using namespace std; const int N=1005; int n,m; int mat ; unsigned int dp ; void bfs(int ii,int jj) { for(int j=jj-1;j<=jj+1;j++) { if(j>=1&&j<=m) { dp[ii+1][j]=min(dp[ii][jj]+mat[ii+1][j],dp[ii+1][j]); } } } void solve() { memset(dp,-1,sizeof(dp)); for(int j=1;j<=m;j++) dp[1][j]=mat[1][j]; for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) bfs(i,j); int ans=(1<<30); for(int j=1;j<=m;j++) ans=min(dp [j],ans); printf("%d\n",ans); } int main() { while(scanf("%d%d",&n,&m),n!=0||m!=0) { memset(mat,0,sizeof(mat)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&mat[i][j]); } solve(); } }
相关文章推荐
- BOJ1293 小马过河 dp
- 过河(状压dp典型题)
- 由小马过河想到的
- 小马过河
- 【luogu1052】过河(dp)
- vijos 1002 过河(一类压缩长度的DP)
- 过河 贪心dp
- 【状态压缩DP】NOIP2005-river过河
- Noip 2005 过河 - DP - 离散化
- 袋鼠过河问题(DP)
- hlg1186青蛙过河【dp】
- 【连载】小马过河 —— Angular 学起来难吗?
- 群策群力:传智“小马”齐过河——成都传智播客校园新闻
- HRBUST 1186 青蛙过河(dp)
- vijos p1002 过河(离散化dp)
- [dp][NOIP2005]过河
- 【NOIP2005】过河 DP
- 2017北理校赛H题 青蛙过河(线段树, dp, 离散化)
- 过河卒(坐标类DP 热身)
- 11月--1293--小马过河