Light OJ 1169 - Monkeys on Twin Tower (简单DP)
2016-02-12 22:32
381 查看
解析:
a[0][j]表示在第一个塔的第j层用时,同理a[1][j];
b[0][j]表示从第一个塔的第j层跳到第二个塔的第j+1层用时,同理b[1][j];
则令dp[0][j]为到达第一个塔的第j层的最少总用时,同理dp[1][j];
状态转移方程:dp[j][i] = min(dp[j][i-1],dp[(j+1)%2][i-1]+b[(j+1)%2][i-1])+a[j][i];
[code]:
a[0][j]表示在第一个塔的第j层用时,同理a[1][j];
b[0][j]表示从第一个塔的第j层跳到第二个塔的第j+1层用时,同理b[1][j];
则令dp[0][j]为到达第一个塔的第j层的最少总用时,同理dp[1][j];
状态转移方程:dp[j][i] = min(dp[j][i-1],dp[(j+1)%2][i-1]+b[(j+1)%2][i-1])+a[j][i];
[code]:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1005; int n,a[2][maxn],b[2][maxn],dp[2][maxn]; int main(){ int i,j,k,cas,T; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d",&n); for(i = 0;i < 2;i++) for(j = 1;j <= n;j++) scanf("%d",&a[i][j]); for(i = 0;i < 2;i++) for(j = 1;j <= n-1;j++) scanf("%d",&b[i][j]); for(i = 1;i <= n;i++){ for(j = 0;j < 2;j++){ dp[j][i] = min(dp[j][i-1],dp[(j+1)%2][i-1]+b[(j+1)%2][i-1])+a[j][i]; } } printf("Case %d: %d\n",T,min(dp[0] ,dp[1] )); } return 0; }
相关文章推荐
- Python教程学习简记9--Python 返回函数 闭包
- Android批量图片加载经典系列——Volley框架实现多布局的新闻列表
- 面试笔试杂项积累-leetcode 241-245
- android 入门 005(登录记住)
- 关于Struts2三种访问Servlet API方式的总结
- 2016/2/12 codes
- 在android平台hook OpenGL es的API
- Activity以及fragment的简单重写
- ROS(机器人操作系统)学习(一)ROS开发环境搭建
- 面试笔试杂项积累-leetcode 236-240
- ANDROID_MARS学习笔记_S01原始版_001_Intent
- java集合中hashSet与TreeSet学习总结
- [小技巧] Linux 里快速安装缺少的库
- LeetCode Algorithms #13 <Roman to Integer>
- android 截图
- C语言指针赋值0会产生什么结果?
- HTML前端开发之路——多列布局
- sql存储过程的加密和解密(适用于SQLSERVER2000存储过程)
- 使用JSTL标签库替换Struts1中的logic标签
- hdu2602 Bone Collector(01背包+入门)