poj之旅——2385
2016-05-16 21:42
288 查看
题目描述:2棵苹果树在T分钟内随机由某一棵苹果树掉下一个苹果,奶牛站在树#1下等
着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。
题解:这道题我定义
dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])
dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。
如果当前的次数刚到当前树下,dp[i][j]++;
参考程序:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 1100
using namespace std;
int dp[maxn][35];
int a[maxn];
int main(){
int n,w;
while (scanf("%d %d",&n,&w)==2){
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)scanf("%d",&a[i]);
if (a[1]==1){
dp[1][0]=1;dp[1][1]=0;
}
else{
dp[1][1]=1;dp[1][0]=0;
}
for (int i=2;i<=n;i++){
for (int j=0;j<=w;j++){
if (j==0){
dp[i][j]=dp[i-1][j]+a[i]%2;
continue;
}
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
if (j%2+1==a[i])dp[i][j]++;
}
}
int ans=dp
[0];
for (int i=1;i<=w;i++)
ans=max(ans,dp
[i]);
printf("%d",ans);
}
return 0;
}
另外,还可以定义dp[x][y][z]表示第x + 1分的时候经过y次移动站在了z+1树下能吃到的最大苹果数,然后搜索所有的xyz组合,更新dp。
给出代码段:
for (int i = 0; i < T - 1; ++i)
{
for (int j = 0; j <= W; ++j)
{
for (int k = 0; k < 2; ++k)
{
if (k == tree[i + 1])
{
// 下一个苹果掉在当前树下,那么下一分钟?
// 站着不动吃一个
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);
// 移动没吃到,不变
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k]);
}
else
{
// 下一个苹果掉在另一树下,那么下一分钟?
// 站着不动没吃到
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);
// 移动吃一个
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k] + 1);
}
}
}
}
着吃苹果,它最多愿意移动W次,问它最多能吃到几个苹果。
题解:这道题我定义
dp状态方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])
dp[i][j]标示在时间i,已经来回了j次时的最大苹果数目。
如果当前的次数刚到当前树下,dp[i][j]++;
参考程序:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 1100
using namespace std;
int dp[maxn][35];
int a[maxn];
int main(){
int n,w;
while (scanf("%d %d",&n,&w)==2){
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)scanf("%d",&a[i]);
if (a[1]==1){
dp[1][0]=1;dp[1][1]=0;
}
else{
dp[1][1]=1;dp[1][0]=0;
}
for (int i=2;i<=n;i++){
for (int j=0;j<=w;j++){
if (j==0){
dp[i][j]=dp[i-1][j]+a[i]%2;
continue;
}
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
if (j%2+1==a[i])dp[i][j]++;
}
}
int ans=dp
[0];
for (int i=1;i<=w;i++)
ans=max(ans,dp
[i]);
printf("%d",ans);
}
return 0;
}
另外,还可以定义dp[x][y][z]表示第x + 1分的时候经过y次移动站在了z+1树下能吃到的最大苹果数,然后搜索所有的xyz组合,更新dp。
给出代码段:
for (int i = 0; i < T - 1; ++i)
{
for (int j = 0; j <= W; ++j)
{
for (int k = 0; k < 2; ++k)
{
if (k == tree[i + 1])
{
// 下一个苹果掉在当前树下,那么下一分钟?
// 站着不动吃一个
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);
// 移动没吃到,不变
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k]);
}
else
{
// 下一个苹果掉在另一树下,那么下一分钟?
// 站着不动没吃到
dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);
// 移动吃一个
dp[i + 1][j + 1][move(k)] = max(dp[i + 1][j + 1][move(k)], dp[i][j][k] + 1);
}
}
}
}
相关文章推荐
- mjpg-streamer移植
- php单例模式
- jquery
- Spark Streaming揭秘 Day10 从BlockGenerator看接收数据的生命周期
- python中模拟进行ssh命令的执行
- LeetCode Single Number II
- spring数据连接泄漏
- python中模拟进行ssh命令的执行
- ssh加密访问
- Java面向对象之继承
- Java面向对象之多态
- 深入java之java语言基础(一)
- 【BZOJ4597】【Shoi2016】随机序列 线段树
- VC隐藏console
- HYSBZ 1758 重建计划
- Java面向对象之多态
- python
- Linux软RAID的技术概要及实现
- error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1600”
- Eclipse 运行C/C++