题目链接
POJ-1163-数字三角形
1.暴力dfs超时
class Main {
static Scanner scanner = new Scanner(System.in);
final static int MAXN = 100 + 3;
static int n;
static int arr[][] = new int[MAXN][MAXN];
static int flag[][] = new int[MAXN][MAXN];
// r表示行,c表示列
//第一次 r = 1, c = 1
static int dfs(int r,int c){
//搜索至n+1行结束
if(r == n+1) return 0;
return arr[r][c] + Math.max(dfs(r + 1, c), dfs(r + 1, c + 1));
}
public static void main(String[] args) {
n = scanner.nextInt();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
arr[i][j] = scanner.nextInt();
}
}
int ans = dfs(1,1);
System.out.println(ans);
}
}
2. 记忆化搜索,Accept,本质是剪枝
static int dfs(int r,int c){
//搜索至n+1行结束
if(r == n+1) return 0;
if(flag[r][c] != 0) return flag[r][c];
flag[r][c] = arr[r][c] + Math.max(dfs(r + 1, c), dfs(r + 1, c + 1));
return flag[r][c];
}
public static void main(String[] args) {
n = scanner.nextInt();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
arr[i][j] = scanner.nextInt();
}
}
int ans = dfs(1,1);
System.out.println(ans);
}
3. 动态规划(递推)
由dfs的递归状态,打散后可以总结出,从后往前的递推算法。
仔细体会
public class Main {
static Scanner scanner = new Scanner(System.in);
final static int MAXN = 100 + 3;
static int n;
static int arr[][] = new int[MAXN][MAXN];
static int ans[] = new int[MAXN];
public static void main(String[] args) {
n = scanner.nextInt();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
arr[i][j] = scanner.nextInt();
}
}
for(int i = 1; i <= n; i++) ans[i] = arr[n][i];
for(int i = n-1; i >= 1; i--){
for(int j = 1; j <= i; j++){
ans[j] = arr[i][j] + Math.max(ans[j+1],ans[j]);
}
}
System.out.println(ans[1]);
}
}