タイトルリンク:
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); for(int i = 1 ; i <= m; i ++)for(int j = 1 ; j <= n; j ++)scanf(" %d "、&s [i] [j]); a [ 1 ] [ 1 ] = s [ 1 ] [ 1 ]; for(int k = 2; k <= m + n; k ++)for(int i = k- 1 ; i> = 1 ; i --)for(int 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を返し ます。 }
うまく書けない場合がございますが、何か問題がありましたら、指摘をお願いします、よろしくお願いします。