【题目描述】
暴力DFS
时间复杂度 O(2 ^(m*n))
只能通过 30%的数据
import java.util.Scanner;
public class Main{
static int N = 55;
static int n, m, k;
static int [][]g = new int[N][N];
static long ans = 0;
static int p = 1000000007;
static int dx[] = {1, 0};
static int dy[] = {0, 1};
public static void dfs(int x, int y, int curMax, int cnt){
//System.out.println(x + " "+ y + " "+ min + " "+ cnt);
//已经走到右下角
if( x == n - 1 && y == m - 1 )
{
//如果宝贝个数等于k
if( cnt == k) ans = (ans + 1) % p;
return;
}
for(int i = 0; i < 2; i ++)
{
int a = x + dx[i], b = y + dy[i];
if( a >= 0 && a < n && b >= 0 && b < m)//合法位置
{
//(a,b)位置的宝贝比已有的都大 可以考虑是否拿起
if( g[a][b] > curMax && cnt < k )
{
dfs(a, b, g[a][b], cnt + 1);//拿起
}
dfs(a, b, curMax, cnt);
}
}
}
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
n = reader.nextInt();
m = reader.nextInt();
k = reader.nextInt();
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
g[i][j] = reader.nextInt();
dfs(0, 0, - 1, 0);//(0,0)位置不宝物选
dfs(0, 0, g[0][0], 1); // (0,0)位置宝物选
System.out.println(ans);
}
}
动态规划
【思路】
最长上升子序列 摘花生问题的综合
import java.util.Scanner;
public class Main {
static int n,m,k;
static final int mod=1000000007;
static int N = 55;
static int w[][] =new int[N][N];
static int f[][][][] = new int[N][N][13][14];//x 、 y 、k、 c
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
n=reader.nextInt();
m=reader.nextInt();
k=reader.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
w[i][j]=reader.nextInt() + 1; //将价值范围变为1~13
}
}
f[1][1][1][w[1][1]] = 1; //(1,1)位置取宝贝
f[1][1][0][0] = 1; //(1,1)位置不取宝贝 c为0
long res = 0;
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 ++)
{
f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u][v]) % mod;
f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u][v]) % mod;
if( u > 0 && w[i][j] == v)
{
for(int c = 0; c < v; c ++)
{
f[i][j][u][v] = (f[i][j][u][v] + f[i][j - 1][u - 1][c]) % mod;
f[i][j][u][v] = (f[i][j][u][v] + f[i - 1][j][u - 1][c]) % mod;
}
}
}
}
}
for(int i = 0; i <= 13; i ++)
res = (res + f[n][m][k][i])%mod;
System.out.println(res);
}
}