zoukankan      html  css  js  c++  java
  • CodeForces

    题意翻译

    给定一个 2×n 的矩阵,现从中选择若干数,且任意两个数不上下或左右相邻,求这些数的和最大是多少?

    题目描述

    Finally, a basketball court has been opened in SIS, so Demid has decided to hold a basketball exercise session. 2 cdot n2n students have come to Demid's exercise session, and he lined up them into two rows of the same size (there are exactly nn people in each row). Students are numbered from 11 to nn in each row in order from left to right.

    Now Demid wants to choose a team to play basketball. He will choose players from left to right, and the index of each chosen player (excluding the first one) will be strictly greater than the index of the previously chosen player. To avoid giving preference to one of the rows, Demid chooses students in such a way that no consecutive chosen students belong to the same row. The first student can be chosen among all 2n2n students (there are no additional constraints), and a team can consist of any number of students.

    Demid thinks, that in order to compose a perfect team, he should choose students in such a way, that the total height of all chosen students is maximum possible. Help Demid to find the maximum possible total height of players in a team he can choose.

    输入输出格式

    输入格式:

    The first line of the input contains a single integer nn ( 1 le n le 10^51n105 ) — the number of students in each row.

    The second line of the input contains nn integers h_{1, 1}, h_{1, 2}, ldots, h_{1, n}h1,1,h1,2,,h1,n ( 1 le h_{1, i} le 10^91h1,i109 ), where h_{1, i}h1,i is the height of the ii -th student in the first row.

    The third line of the input contains nn integers h_{2, 1}, h_{2, 2}, ldots, h_{2, n}h2,1,h2,2,,h2,n ( 1 le h_{2, i} le 10^91h2,i109 ), where h_{2, i}h2,i is the height of the ii -th student in the second row.

    输出格式:

    Print a single integer — the maximum possible total height of players in a team Demid can choose.

    输入输出样例

    输入样例#1:
    5
    9 3 5 7 3
    5 8 1 4 5
    
    输出样例#1: 
    29
    
    输入样例#2: 
    3
    1 2 9
    10 1 1
    
    输出样例#2: 
    19
    
    输入样例#3: 
    1
    7
    4
    
    输出样例#3: 
    7
    

    说明

    In the first example Demid can choose the following team as follows:

    In the second example Demid can choose the following team as follows:

    题解出处:https://www.luogu.org/problemnew/solution/CF1195C

    很水的一道C题……目测难度在黄~绿左右。请各位切题者合理评分。

    注意到可以选择的球员编号是严格递增的,因此可以把状态的第一维定义为球员编号,第二维描述编号同为 ii 的两名球员的选取情况。

    定义状态:f[i][0/1/2]f[i][0/1/2] 表示选取了编号在 ii 及以前的球员,所能得到的身高总和最大值。其中,第二维的 00 表示编号为 ii 的球员一个都不选;11 表示只选上面一个;ii 表示只选下面一个。(显然没有上下都选的情况)

    状态转移方程:

    f[i][0]=max{f[i1][0],f[i1][1],f[i1][2]}f[i][1]=maxlbrace f[i-1][0],f[i-1][2] brace+height[i][1]f[i][1]=max{f[i1][0],f[i1][2]}+height[i][1]f[i][2]=maxlbrace f[i-1][0],f[i-1][1] brace+height[i][2]f[i][2]=max{f[i1][0],f[i1][1]}+height[i][2]

    Update: 用贪心可以证明,在最优解中,不会出现连续两列一个不取的情况。因此, f[i][0]f[i][0] 其实没有必要考虑来自 f[i-1][0]f[i1][0] 的状态转移。

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int N;
    ll h[100005][3];
    ll f[100005][3];
    int main() {
        cin >> N;
        for (register int i = 1; i <= N; ++i) cin >> h[i][1];
        for (register int i = 1; i <= N; ++i) cin >> h[i][2];
        f[1][0] = 0;
        f[1][1] = h[1][1];
        f[1][2] = h[1][2];
        for (register int i = 2; i <= N; ++i) {
            f[i][0] = max(f[i - 1][0], max(f[i - 1][1], f[i - 1][2]));
            f[i][1] = max(f[i - 1][0], f[i - 1][2]) + h[i][1];
            f[i][2] = max(f[i - 1][0], f[i - 1][1]) + h[i][2];
        }
        cout << max(f[N][0], max(f[N][1], f[N][2]));
        return 0;
    }
  • 相关阅读:
    Javascript 智能输入数字且保留小数点后三位
    dedecms 在模版页面获取当前栏目id
    photoshop打开图片显示的是索引,无法编辑解决
    Mac+Apache+PHP 安装 Xdebug 方法
    dedecms 模版里格式化时间标签
    input中只能写入数字int、float
    dedecmsv5.7 前台模版里输出变量
    Dedecms V5.7 关于session
    JQuery 获取select被选中的value和text
    如何使用Anaconda
  • 原文地址:https://www.cnblogs.com/YY666/p/11238715.html
Copyright © 2011-2022 走看看