Codeforces Round #574 (Div. 2)——C. Basketball Exercise(简单DP)

题目传送门

大致题意:

输入n,给出两组均为 n个数字的数组a和b,轮流从a和b数组中取出一个数字,要求严格按照当前所选数字的数组下标比上一个所选数字的数组下标更大,计算能够取出的数字加起来的总和最大能为多少。
测试样例1:

输入:
5
9 3 5 7 3
5 8 1 4 5

输出:29

提示:选择下面划线标记的数字(9 8 5 4 3)
9 3 5 7 3
5 8 1 4 5

测试样例2:

输入:
3
1 2 9
10 1 1

输出:19

提示:(选择10 9)
1 2 9
10 1 1

题解:

简单的dp题,考虑选与不选两种状态,dp数组0为先取a的情况,1为先取b的情况。

#include
typedef long long ll;
using namespace std;
ll n,a[100005],b[100005],dp[2][100005];
int main()
{
    ios::sync_with_stdio(false);
    while(!(cin>>n).eof()){
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
            cin>>b[i];
        for(int i=1;i<=n;i++){
            dp[1][i]=max(dp[0][i-1]+b[i],dp[1][i-1]);
            dp[0][i]=max(dp[1][i-1]+a[i],dp[0][i-1]);
        }
        cout<<max(dp[1][n],dp[0][n])<<endl;
    }
    return 0;
}

你可能感兴趣的:(题解,动态规划dp)