地宮取寶

XX國王有一個地宮寶庫,是 n×mn×m 個格子的矩陣,每個格子放一件寶貝,每個寶貝貼着價值標籤。

地宮的入口在左上角,出口在右下角。

小明被帶到地宮的入口,國王要求他只能向右或向下行走。

走過某個格子時,如果那個格子中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它(當然,也可以不拿)。

當小明走到出口時,如果他手中的寶貝恰好是kk件,則這些寶貝就可以送給小明。

請你幫小明算一算,在給定的局面下,他有多少種不同的行動方案能獲得這kk件寶貝。

輸入格式
第一行 33 個整數,n,m,kn,m,k,含義見題目描述。

接下來 nn 行,每行有 mm 個整數 CiCi 用來描述寶庫矩陣每個格子的寶貝價值。

輸出格式
輸出一個整數,表示正好取 kk 個寶貝的行動方案數。

該數字可能很大,輸出它對 10000000071000000007 取模的結果。

數據範圍
1n,m501≤n,m≤50,
1k121≤k≤12,
0Ci120≤Ci≤12
輸入樣例1:

2 2 2
1 2
2 1

輸出樣例1:

2

輸入樣例2:

2 3 2
1 2 3
2 1 5

輸出樣例2:

14
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 55, MOD = 1000000007;

int n, m, k;
int w[N][N];
int f[N][N][13][14];

int main()
{
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> w[i][j];
			w[i][j]++;
		}
	}
		
	f[1][1][1][w[1][1]] = 1;
	f[1][1][0][0] = 1;
	
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			if (i == 1 && j == 1) continue;
			for (int u = 0; u <= k; u++)
			{
				for (int v = 0; v <= 13; v++)
				{
					int &val = f[i][j][u][v];
					val = (val + f[i - 1][j][u][v]) % MOD;
					val = (val + f[i][j - 1][u][v]) % MOD;
					if (v == w[i][j])
					{
						for (int c = 0; c < v; c++)
						{
							val = (val + f[i - 1][j][u - 1][c]) % MOD;
							val = (val + f[i][j - 1][u - 1][c]) % MOD;
						}
					}
				} 
			}
		}
	int res = 0;
	for (int i = 0; i <= 13; i++)
	{
		res = (res + f[n][m][k][i]) % MOD;
	}
	cout << res << endl;
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章