空腹小さなアリの採餌は、幸運少しアリは食糧の多くを発見しました。
しかし、これらの食品のN * Mは、下の魔法の箱の右コーナー、そして小さなアリは、正方形、円の左上隅に位置しています。
そして、小さなアリは魔法を唱えている、またはそれだけで右に下ることができます。
ルートの数は、食品ボックスに来ている可能性があることを計算する小さなアリを助けてください。
入力形式
入力の複数のセット、
2つの正の整数の各セットN、 M (N 、M ≤ 30 )。彼は魔方陣を表します。
出力フォーマット
経路の数の合計を表す整数。
アイデア:最初の二つのアイデアは、メモリのDFS検索を選択して追加することができます
ACコード:
#include <iostreamの>
する#include <cstdioを>
する#include <アルゴリズム>
の#include <CStringの>
使用して 名前空間STD。
typedefの長い 長いLL。
LLのDP [ 50 ] [ 50 ]。
int型の D [ 2 ] [ 2 ] = {{ 1、0 }、{ 0、1 }}。
INTのN、M。
LL DFS(int型のx、int型のY){
場合(DP [X] [Y])戻りDP [X] [Y]。
以下のための(int型私は=0 ; iは< 2 ; iは++ ){
int型 DX = X + D [i]が[ 0 ]。
INTの DY = Y + D [i]を[ 1 ]。
もし(DX> = 1 && DY> = 1 && DX <= N && DY <= M){
DP [X] [Y] + = DFS(DX、DY)。
}
}
戻りDP [X] [Y]。
}
int型のmain(){
一方(CIN >> N >> M){
memsetの(DP、0、はsizeof (DP))。
DP [n]は[m]は = 1 。
coutの << DFS(1、1)<< ENDL。
}
戻り 0 。
}
直接動的プログラミングアイデア2(にくい)行列の数と同様である和maxはそれを置き換える、取られ、(一般的なスキームは、最大合計を交換する必要があります)
ACコード:
#include <iostreamの>
する#include <cstdioを>
する#include <アルゴリズム>
の#include <CStringの>
使用して 名前空間STD。
typedefの長い 長いLL。
LLのDP [ 50 ] [ 50 ]。
INTのN、M。
INT メイン(){
一方(CIN >> N >> M){
DP [ 1 ] [ 1 ] = 1 。
以下のために(int型 i = 1 ; iは= <N; I ++ )
のための(INT J = 1 ; J <= M; J ++)
DP [I] [J] + = DP [I- 1 ] [J] + DP [I]、[J- 1 ]。
COUT << DP [n]は[M] << ENDL。
}
戻り 0 。
}