superoj907 walk
2015-10-08 18:42
281 查看
题目:
第一行二个整数 n,m 。
接下来 n 行,每行 m 个正整数 ai ,描述棋盘。
输出一行,一个正整数,描述的答案。
输入 [复制]
4 5
1 9 1 1 1
1 9 1 9 1
1 9 1 9 1
1 1 1 9 1
输出
14
【数据范围】
100分的数据满足:1≤n,m≤1000;0≤ai<231 。
分析
典型的dp题 因为不能往左走 所以每一列的状态一定是从前一列转移过来的 暴力dp复杂度O(n^3)
利用背包思想优化,复杂度O(n^2)
代码
输入格式
第一行二个整数 n,m 。接下来 n 行,每行 m 个正整数 ai ,描述棋盘。
输出格式
输出一行,一个正整数,描述的答案。
样例数据 1
输入 [复制]4 5
1 9 1 1 1
1 9 1 9 1
1 9 1 9 1
1 1 1 9 1
输出
14
备注
【数据范围】100分的数据满足:1≤n,m≤1000;0≤ai<231 。
分析
典型的dp题 因为不能往左走 所以每一列的状态一定是从前一列转移过来的 暴力dp复杂度O(n^3)
利用背包思想优化,复杂度O(n^2)
代码
#include<cmath> #include<ctime> #include<cstdlib> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; long long n,m; long long map[2001][2001]; long long dp[2001][2001]; long long read() { long long k=0,f=1; char c=getchar(); while(c>'9'||c<'0') {if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9') {k=k*10+(c-'0'); c=getchar();} return k*f; } int main() { //、、("walk.in","r",stdin); //freopen("walk.out","w",stdout); long long i,j,k; n=read(); m=read(); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { map[i][j]=read(); } if(n==1) { long long sum=0; for(i=1;i<=m;i++) sum+=map[1][i]; cout<<sum; return 0; } for(i=1;i<=n;i++) for(j=1;j<=m;j++) dp[i][j]=1152921504606846975LL; dp[1][1]=map[1][1]; for(i=2;i<=n;i++) { dp[i][1]=dp[i-1][1]+map[i][1]; } for(i=2;i<=m;i++) { for(j=1;j<=n;j++) { dp[j][i]=dp[j][i-1]+map[j][i]; } for(j=1;j<n;j++) dp[j+1][i]=min(dp[j+1][i],dp[j][i]+map[j+1][i]); for(j=n;j>=2;j--) dp[j-1][i]=min(dp[j-1][i],dp[j][i]+map[j-1][i]); } cout<<dp [m]; return 0; }
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 动易2006序列号破解算法公布
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- Ruby实现的矩阵连乘算法
- CreateWeb.vbs 代码
- C#插入法排序算法实例分析
- Lua中编译执行代码相关的函数详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?