poj 2385 Apple Catching
2015-06-19 00:24
441 查看
分析:
题意大致为:两棵树每分钟仅有一棵会掉果子,设为Tree 1, Tree 2。可用数组记录,记为a[i][j] = 1或0。找时刻为 j 的状态,此时在树 i 上,可移动 k 次,即d[i][j][k]。
推测如何从前面的状态转移到此状态。前一状态有两种,即在j - 1时刻,这头牛要么在tree 1,要么在tree 2。可得状态转移方程:d[i][j][k] = max(d[i][j - 1][k], d[(i % 2) + 1][j - 1][k + 1])。注意枚举的顺序。
代码:
题意大致为:两棵树每分钟仅有一棵会掉果子,设为Tree 1, Tree 2。可用数组记录,记为a[i][j] = 1或0。找时刻为 j 的状态,此时在树 i 上,可移动 k 次,即d[i][j][k]。
推测如何从前面的状态转移到此状态。前一状态有两种,即在j - 1时刻,这头牛要么在tree 1,要么在tree 2。可得状态转移方程:d[i][j][k] = max(d[i][j - 1][k], d[(i % 2) + 1][j - 1][k + 1])。注意枚举的顺序。
代码:
<span style="font-family:System;">#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1000 + 10; int a[maxn][3], d[3][maxn][32]; int n, w; int main() { cin >> n >> w; memset(a, 0, sizeof(a)); memset(d, 0, sizeof(d)); for (int i = 1; i <= n; i++) { int t; cin >> t; a[i][t] = 1; } for (int j = 1; j <= n; j++) for (int k = w; k >= 0; k--) for (int i = 1; i <= 2; i++) d[i][j][k] = max(d[i][j - 1][k], d[(i % 2) + 1][j - 1][k + 1]) + a[j][i]; int ans = 0; for (int k = 0; k <= w; k++) for (int i = 1; i <= 2; i++) if (d[i] [k] > ans) ans = d[i] [k]; cout << ans; return 0; }</span><span style="font-family:Courier New;"> </span>
相关文章推荐
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- Android开发调试必备 - 使用DDMS
- Android的Activity屏幕切换动画(一)-左右滑动切换overridePendingTransition
- android TextView的xml属性一览表
- Android开发_如何设置按钮背景透明与半透明_图片背景透明
- android中getApplicationContext()、this、getApplication()、getBaseContext之间的区别
- Android native debug: 手动使用gdbserver远程调试C代码
- (1)Swift开始前的准备
- IOS 使用SDWebImage清除图片缓存
- IOS 获取触摸点的坐标位置
- 【转】渗透测试环境搭建常用命令方法checklist(iOS&&Android)
- 微信企业号 调用 JS-SDK 实现接口功能
- Xamarin iOS教程之键盘的使用和设置
- Xamarin iOS教程之进度条和滚动视图
- 【猫猫的Unity Shader之旅】之Lambert光照
- Object.defineproperty实现数据和视图的联动
- Dapper学习笔记(一)
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- Android中图片优化之webp使用
- Android中图片优化之webp使用