2014第五ブルーブリッジカップグループB I C ++タイトル
地下宮殿の宝物を取ります
王のXは、地下宮殿宝庫宝物を持っています。n×mの格子行列です。各グリッドは、赤ちゃんを置きます。ラベルの値に、それぞれの赤ちゃんに近いです。
上部の地下宮殿の入り口には、右下隅にある出口にコーナーを残しました。
ボブは、地下宮殿の入口に撮影された、王は右または下のみに歩くように頼みました。
グリッド値は、赤ちゃんがどんな赤ちゃん暁明の手の値よりも大きい場合には、暁明は(もちろん、あなたが取ることができない)それを拾うことができ、グリッドによって歩きました。
ボブは、出口に行ったとき、彼は赤ん坊のk個の手の中にあることを起こる場合は、その後、赤ちゃんはボブに与えられます。
してくださいヘルプ暁明は、与えられた状況で、彼はこのk個の宝物を得るために、異なる作用コース数を持っている、と語りました。
【数据格式】
输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)
接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
例如,输入:
2 2 2
1 2
2 1
程序应该输出:
2
再例如,输入:
2 3 2
1 2 3
2 1 5
程序应该输出:
14
この質問は、メモリの検索です。
オリジナルのシンプルなのDFSと考えてください。。その後、データは畏敬の念で私を聞かせて50 * 50です。。または、正直なメモリを検索します。。
唯一のダウンまたは右に。
そして、ライン上の最大レコード。手には大きな保持よりも、現在のグリッドの値の場合。(厳密大)
、2つのオプションがあります。取るか取りません。
小さな場合は、選択の余地がなかったです。のみ取ることはありません。。
したがって、
[X] DP [Y] [和] [MAXX]
レコードは、現在の点(x、y)は和アイテムを取っ示します。これのMAXXの最大
DPは-1に初期化されるので、私は、コードを書いていたとき。次いで、グリッド内のこれらの項目の値は、いくつかは0であり、厳密に大きくなることができます。そうDFSを開始するときMAXX = -1;
そう最後に一次元コード部DP事実、より大きい方の電流の最大値
ない効果。。
下方又は右方向中間コード。〜お友達を追加することができるプログラムの数を取りましょうか
ねえ。うんもっと練習が必要
コードセクション
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
const int mod = 1e9 + 7;
const int N = 55;
using namespace std;
int n, m, k;
int a[N][N];
int dp[N][N][15][15];
int dfs(int x, int y, int sum, int maxx)
{
if (dp[x][y][sum][maxx + 1] != -1)
{
return dp[x][y][sum][maxx + 1];
}
int ans = 0;
if (x == n - 1 && y == m - 1)
{
if (sum == k || sum == k - 1 && a[x][y] > maxx)
{
ans++;
ans %= mod;
}
return dp[x][y][sum][maxx + 1] = ans % mod;
}
if (x < n - 1)
{
if (a[x][y] > maxx)
{
ans += dfs(x + 1, y, sum + 1, a[x][y]);
ans %= mod;
}
ans += dfs(x + 1, y, sum, maxx);
ans %= mod;
}
if (y < m - 1)
{
if (a[x][y] > maxx)
{
ans += dfs(x, y + 1, sum + 1, a[x][y]);
ans %= mod;
}
ans += dfs(x, y + 1, sum, maxx);
ans %= mod;
}
return dp[x][y][sum][maxx + 1] = ans % mod;
}
int main()
{
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf ("%d", &a[i][j]);
}
}
mst(dp, -1);
cout << dfs(0, 0, 0, -1) << endl;
return 0;
}