#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN], n, m, ans = 1e9, minn = 1e9, mem[MAXN][MAXN];
void dfs(int x, int y, int sum) {
if (sum >= ans) return;
if (x == n && y == m) {
ans = min(ans, sum);
return;
}
if (sum + (n - x + m - y)*minn >= ans) return;
if (x + 1 <= n)dfs(x + 1, y, sum + a[x + 1][y]);
if (y + 1 <= m)dfs(x, y + 1, sum + a[x][y + 1]);
}
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]);
minn = min(a[i][j], minn);
}
memset( mem, -1, sizeof mem);
dfs(1, 1, a[1][1]);
cout << ans;
return 0;
}
这是求最小路径和的程序
其他剪枝都加了,仍然TLE(?大概吧)
只能想到记忆化了