这是IPL问题:http://www.iarcs.org.in/inoi/2014/zco2014/zco2014-2b.php
在IPL 2025中,每个玩家的报酬金额因比赛而异。比赛费用取决于对手的素质,比赛场地等。
新赛季每场比赛的比赛费用已经预先宣布。每支球队都必须执行强制轮换政策,以使本赛季没有球员连续打三场比赛。
尼希尔(Nikhil)是队长,并为每场比赛选择球队。他想为自己分配比赛时间表,以通过本赛季的比赛费来最大化自己的收入。
输入格式
第1行:单个整数N,即IPL赛季的比赛次数。
第2行:N个非负整数,其中位置i处的整数表示匹配i的费用。
输出格式
输出由单个非负整数组成,这是Nikhil在该IPL季节可以赚取的最大金额。
测试数据
只有一个子任务的价值为100分。在所有输入中:
1≤N≤2×10 ^ 5
每场比赛的费用在0到10 ^ 4(含)之间。
实时评估数据
考试期间服务器上有12个测试输入。
限制
时间限制:1秒
内存限制: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的逻辑,因为我知道2个更简单的DP解决方案(它们已经正确通过了)。
答案 0 :(得分:1)
该错误已纠正。输出假定该家伙将在最后一天收费,这不是必须的。因此,dp [N-2] [0]应该在max(a,b,c,..)项之中。