您的位置:首页 > 移动开发

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: