Luogu P1006情報Orsay One Pass 1853合格点

タイトルリンク:
Luogu https://www.luogu.com.cn/problem/P1006

情報オリンピックhttp://ybt.ssoier.cn:8088/problem_show.php?pid=1853

 

これは動的な計画の問題です。

二つのパスが同時に行われたと考えることができ、[i] [j]はkステップが実行され、最初のアイテムがi番目の行に移動し、2番目のアイテムがj番目の列の最大値に移動したことを示します。

01バックパックの原理を使用して、1次元からスペースを押し出して、2次元配列のみが使用され、時間の複雑度はO((m + n)* mn)になります。

コード:

#include <stdio.h>
 int a [ 101 ] [ 101 ]、s [ 101 ] [ 101 ]、m、n、a1;
int main(){ 
    scanf(" %d%d "、&​​m、&n);
    forint i = 1 ; i <= m; i ++)forint j = 1 ; j <= n; j ++)scanf(" %d "、&s [i] [j]); 
    a [ 1 ] [ 1 ] = s [ 1 ] [ 1 ];
    forint k = 2; k <= m + n; k ++)forint i = k- 1 ; i> = 1 ; i --)forint j = k- 1 ; j> = i; j-- ){ 
        a1 = a [i] [j];
        if(a [i- 1 ] [j- 1 ]> a1)a1 = a [i- 1 ] [j- 1 ];
        if(a [i] [j- 1 ]> a1)a1 = a [i] [j- 1 ];
        if(a [i- 1 ] [j]> a1)a1 = a [i- 1 ] [j]; 
        a [i] [j] = a1 + s [i] [ki] + s [j] [kj] *(i!= j); 
    } 
    printf(" %d "、a [m- 1 ] [m]);
    0を返し ます
}

うまく書けない場合がございますが、何か問題がありましたら、指摘をお願いします、よろしくお願いします。

おすすめ

転載: www.cnblogs.com/sy666/p/12722707.html