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

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])。注意枚举的顺序。

代码:

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