[POJ 2385]Apple Catching[DP]
2016-01-13 17:45
337 查看
题目链接:[POJ 2385]Apple Catching[DP]
题意分析:
每分钟树1和树2两棵树之中都会有一棵树掉落苹果,现在给出分钟数N和W次转换树次数,其中,1代表当前分钟苹果在树1掉落,2代表苹果在树2掉落,转换树不耗费时间,问:最多能接多少个苹果?
解题思路:
我们设状态,dp[i][j]代表到第i分钟,转换j次,最多可以拿到多少苹果。那么就有dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + 当前能否接到苹果。dp[i - 1][j]为不转换,dp[i - 1][j - 1]为转换。然后考虑转换次数的奇偶性就可以了。
个人感受:
啊,这题虽然大家都说水,然而如今才会做的我,表示莫大的开心啊= =。这是我dp史上的阴影= =,终于自己A了。
具体代码如下:
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
#define ll long long
using namespace std;
const int MAXN = 1e3 + 111;
int dp[MAXN][50];
int t[MAXN];
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\apple\\Desktop\\in.txt", "r", stdin);
#endif
int n, w; scanf("%d%d", &n, &w);
for (int i = 1; i <= n; ++i) {
scanf("%d", t + i);
t[i] -= 1;
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= w; ++j) {
if (j % 2)
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + t[i];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + !t[i];
}
}
printf("%d\n", dp
[w]);
return 0;
}
题意分析:
每分钟树1和树2两棵树之中都会有一棵树掉落苹果,现在给出分钟数N和W次转换树次数,其中,1代表当前分钟苹果在树1掉落,2代表苹果在树2掉落,转换树不耗费时间,问:最多能接多少个苹果?
解题思路:
我们设状态,dp[i][j]代表到第i分钟,转换j次,最多可以拿到多少苹果。那么就有dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + 当前能否接到苹果。dp[i - 1][j]为不转换,dp[i - 1][j - 1]为转换。然后考虑转换次数的奇偶性就可以了。
个人感受:
啊,这题虽然大家都说水,然而如今才会做的我,表示莫大的开心啊= =。这是我dp史上的阴影= =,终于自己A了。
具体代码如下:
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
#define ll long long
using namespace std;
const int MAXN = 1e3 + 111;
int dp[MAXN][50];
int t[MAXN];
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\apple\\Desktop\\in.txt", "r", stdin);
#endif
int n, w; scanf("%d%d", &n, &w);
for (int i = 1; i <= n; ++i) {
scanf("%d", t + i);
t[i] -= 1;
}
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= w; ++j) {
if (j % 2)
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + t[i];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + !t[i];
}
}
printf("%d\n", dp
[w]);
return 0;
}
相关文章推荐
- yum提示another app is currently holding the yum lock;waiting for it to exit
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
- android 对话框(二)Dialog列表
- html-手机端-点击按钮-去高亮-加点击效果
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Android应用开发-护眼提醒-总结篇
- android.os.BinderProxy cannot 百度地图报错
- iOS:实现邮件和短信发送的简单示例
- Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能
- Masonry介绍与使用实践
- RDVTabBarController--可自由定制的iOS底部导航控件的使用总结
- Qt webview 使用
- Android ListView头部悬浮效果
- Android 事件的分发和消费机制
- iOS7程序后台运行
- iOS小demo之为图层添加图片和边框
- IOS开发常用的开源类库
- 如何对 Android 库进行依赖管理?
- Android Studio教程
- 如何对 Android 库进行依赖管理?