DP问题(IPL)未通过2个测试用例

时间:2018-09-17 19:59:05

标签: algorithm c++14 dynamic-programming

这是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解决方案(它们已经正确通过了)。

1 个答案:

答案 0 :(得分:1)

该错误已纠正。输出假定该家伙将在最后一天收费,这不是必须的。因此,dp [N-2] [0]应该在max(a,b,c,..)项之中。