这里有一个问题: IPL:http://www.iarcs.org.in/inoi/2014/zco2014/zco2014-2b.php
在2025年IPL中,每个玩家的支付金额因比赛而异。比赛费用取决于对手的素质、场地等。
新赛季每一场比赛的比赛费用已经提前宣布。每支球队都必须强制执行轮换政策,这样在本赛季内任何球员都不会连续踢三场比赛。
尼基尔是队长,为每一场比赛挑选球队。他想为自己分配一个比赛时间表,以便通过本赛季的比赛费用使他的收入最大化。
输入格式
第1行:一个整数N,在IPL赛季的比赛次数。
第2行:n个非负整数,其中i位置的整数代表匹配I的费用.
输出格式
输出由一个非负整数组成,这是尼基尔在这个IPL赛季可以赚到的最大金额。
试验数据
只有一个子任务值100分。在所有投入中:
1≤N≤2×10^5
每场比赛的费用在0到10^4之间,包括在内。
现场评价数据
在考试期间,服务器上有12个测试输入。
限制
时限: 1s
内存限制: 32 MB
我已经将DP的所有逻辑都包含在代码本身中,所以我没有单独提到逻辑。10个测试用例通过正确,而剩下的2个测试用例(第2个和介于两者之间)显示WA,尽管我认为逻辑很好。也许我漏掉了一些边缘情况/基本情况。
下面是代码(Ideone链接:https://ideone.com/pPZFPJ)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N; cin>>N;
int arr[N];
for (int i=0; i<=N-1; i++) cin>>arr[i];
int dp[N][3];
// dp[i][0]=max money on day i s.t he charges on day i,i-1
// dp[i][1]=max money on day i s.t he charges on day i,i-2
// dp[i][2]=max money on day i s.t he charges on day i,i-3
dp[0][0] = arr[0]; dp[1][1]=arr[1];
dp[1][0] = arr[0]+arr[1]; //second day
dp[2][0] = arr[1]+arr[2]; dp[2][1] = arr[0]+arr[2]; dp[2][2] = 0;
for (int i=3; i<N; ++i) {
dp[i][0] = arr[i] + max(dp[i-1][1],dp[i-1][2]);
dp[i][1] = arr[i] + max(dp[i-2][0],dp[i-2][1]);
dp[i][2] = arr[i] + dp[i-3][0];
}
cout<<max(max(dp[N-1][0],dp[N-1][1]),dp[N-1][2])<<endl;
/*for (int i=0; i<=N-1; i++)
{
for (int j=0; j<=2; ++j)
cout<<dp[i][j] << " ";
cout<<endl;
}*/
}
/*1 2 3 4 5 6 7 8 9.... i-5 i-4 i-3 i-2 i-1 i i+1 i+2 i+3 ..... N*/请注意,如果输入的人在其他语言中很熟悉,请用C、C++、Java之间的代码编写,否则,我可能很难理解。伪码对我来说同样好,但请说明基本情况。另外,我不想改变DP的逻辑,因为我知道有两个更简单的DP解决方案(并且它们已经正确通过了)。
发布于 2018-09-18 18:12:04
这个错误已经纠正了。产出假设,这家伙将在最后一天充电,这不是必要的。所以,dpN-2应该在最大值(a,b,c,.)之间。术语。
https://stackoverflow.com/questions/52374868
复制相似问题