标签:ssl reac alt desc ted using tree ref usaco
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 15231 | Accepted: 7465 |
Description
Input
Output
Sample Input
7 2 2 1 1 2 2 1 1
Sample Output
6
Hint
Source
题意有两棵树1,2,掉苹果,人一开始在1下,有指定的移动次数,给苹果下落,求最多接到的苹果数
首先想一想,跟平常的题有什么区别
1.人会移动,
2.苹果要判断是否要不移动接到,还是移动接到
3.移动的次数不像是背包问题里的背包容量越多越好,但和背包问题类似
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0];//第i个苹果,j次移动的最好结果,判断一直不动的情况
if(t[i]==1) dp[i][0]++;
for(int j=1;j<=w;j++)
{
if(j%2+1==t[i]){//判断移动后的位置在哪,如果跟这次下落苹果的位置一样
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1;//dp的关键,跟上次的东西有关联,接这个苹果我可以选择i-1个苹果移动相同的次数,然后不动接
//也可以从另一个苹果树移动过来接
}
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
}
}
整体代码
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int t[1000];
int dp[1000][1000];
int main()
{
int n,w;
cin>>n>>w;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0];
if(t[i]==1) dp[i][0]++;
for(int j=1;j<=w;j++)
{
if(j%2+1==t[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+1;
}
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
}
}
cout<<dp[n][w]<<endl;
}
标签:ssl reac alt desc ted using tree ref usaco
原文地址:https://www.cnblogs.com/wpbing/p/9507868.html