ブルーブックのタイトル[ブラシ] && DPパスのメモ

トピックポータル

件名の説明:

小渕はまた、彼らは一緒にいるトピックについての無限の話は常にある、良い友達やクラスメートXiaoxuanです。品質開発活動小渕とXiaoxuanは、従って、それらは直接話すことができない、行列の対角線の両端部に配置されている、クラスメートは、m行n列の行列の手配をしました。幸いなことに、彼らはノートを渡すことによって通信することができます。多くの他の生徒の手を通過注意することは、行列の左上隅に座っ小渕は、座標(M、N)の右下隅Xiaoxuanマトリックス中に座って、(1,1)の座標。下または右のみ宣は小渕を広める紙から転送することができ、萱は紙から渡されたり、送信小渕は左。

活動では、小渕萱は、一枚の紙を渡したい、とXiaoxuanは彼に返事を与えることを願っています。クラスの各学生は、彼らが提供することができますが、これだけの人Xiaoxuanノートがで渡した場合小渕は、その後、時間がXiaoxuanは小渕を手渡しないときを支援することを、一度彼らを助けますその後、支援します。そして、その逆。

もう一つは、クラスのれんのハイとローの学位を助けるために喜んで、各学生(注:度および種類小渕Xiaoxuanは、0入力して、定義されていない)、注意することは、あなたは自然数0-100を使用することができます心を、数より大きいよりよい表現します。小渕とXiaoxuanは、学生が2は2つだけの学生のこの種の範囲と最大パスするようにパスを見つけるために、前後に合格したことをノートに合格するために善意の可能な限り最高の度合いを見つけたいです。さて、あなたは小渕と宣は、このような二つの経路を見つける助けてくださいます。


分析:

まず、我々は、左上から右下に始まる2行に変換することができ、非繰り返し、得られた介して最大データパス。

このようなアイデアを考えるのは簡単です:
F [ バツ 1 ] [ y 1 ] [ x 2 ] [ y 2 ] ( x 1 , y 1 ) ( x 2 , y 2 ) F [X1] [Y1] [X2] [Y2]は第一(X1、Y1)の音の終わり、第二(X2、Y2)と最大値を表します

この質問のためのデータは、もちろんこの方法はあまりにも提供されます。しかし、我々は、したがって、このように可能な限り最高の程度まで、多くの冗長性があるだろう、満たすことができません。

紙が同じタイムパスであるため、その後、彼らのランクの合計が(入手しやすいプッシュ)待機する必要があり、我々はそれと一緒に取得しようとすることができます。
f [ i ] [ x 1 ] [ x 2 ] i ( ( 1 , 1 ) 0 x 1 x 2 F [i]が行と列の和のために[X1] [X2]をI()1,1(のランクを想定ゼロである)、行X1、2行目のX2及び最大で最初のノート

列のこのセットは、行に従って決定することができる後、転送が行われます


コード

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[201][201];
int f[201][51][51];

int main(){
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++) scanf("%d",&a[i][j]);
    for (int i=0;i<=100;i++)
      for (int j=1;j<=min(i+1,n);j++)
        for (int k=1;k<=min(i+1,n);k++){
		    int x1=j,x2=k,y1=i+2-x1,y2=i+2-x2;
		    if (x1==x2 && y1+1==y2+1) f[i+1][x1][x2]=max(f[i+1][x1][x2],f[i][x1][x2]+a[x1][y1+1]);
		    else f[i+1][x1][x2]=max(f[i+1][x1][x2],f[i][x1][x2]+a[x1][y1+1]+a[x2][y2+1]); //右 右
		    if (x1==x2-1 && y1==y2+1) f[i+1][x1+1][x2]=max(f[i+1][x1+1][x2],f[i][x1][x2]+a[x1+1][y1]);
		    else f[i+1][x1+1][x2]=max(f[i+1][x1+1][x2],f[i][x1][x2]+a[x1+1][y1]+a[x2][y2+1]); //下 右
		    if (y1==y2 && x1+1==x2+1) f[i+1][x1+1][x2+1]=max(f[i+1][x1+1][x2+1],f[i][x1][x2]+a[x1+1][y1]);
		    else f[i+1][x1+1][x2+1]=max(f[i+1][x1+1][x2+1],f[i][x1][x2]+a[x1+1][y1]+a[x2+1][y2]); //下 下 
		    if (x1==x2+1 && y1+1==y2) f[i+1][x1][x2+1]=max(f[i+1][x1][x2+1],f[i][x1][x2]+a[x1][y1+1]);
		    else f[i+1][x1][x2+1]=max(f[i+1][x1][x2+1],f[i][x1][x2]+a[x1][y1+1]+a[x2+1][y2]); //右 下 
			 
		}
		printf("%d",f[n+m-2][n][n]);
		return 0;
}

おすすめ

転載: blog.csdn.net/huang_ke_hai/article/details/90606569