動態規劃 數字三角形
阿新 • • 發佈:2019-02-03
import java.util.*; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner reader=new Scanner(System.in); int i,j; int n; int[][]a=new int[1000][1000]; int[][]w=new int[1000][1000]; n=reader.nextInt(); for(i=1;i<=n;i++) for(j=1;j<=i;j++) a[i][j]=reader.nextInt(); for(i=1;i<=n;i++) w[n][i]=a[n][i]; for(i=n-1;i>=1;i--) for(j=1;j<=i;j++) { if(w[i+1][j]>w[i+1][j+1]) w[i][j]=a[i][j]+w[i+1][j]; else w[i][j]=a[i][j]+w[i+1][j+1]; } System.out.println(w[1][1]); } } 1.分析:此問題是一個動態決策問題,每次有兩種選擇左下或右下啊如果有N層利用回溯法一共有2^(n-1)種方法,當N過大時速度過慢 將當前位置(i,j)看做一個狀態,然後定義狀態(i,j)的指標函式d(i,j)為從格子出發時可以得到最大和(包括(i,j)本身)。 2.從格子(i,j)出發有兩種選擇向左或右分別是(i+1,j)或者是(i+1,j+1)再次決策中自由選擇依次推導即可得到值最大數,則狀態轉移方程 d(i,j)=a(i,j)+max{d(i+,j),d(i+1,j+1)}//(從上往下也可反著來)本題解是從下往上 3.記憶搜尋與遞推 法一:int solve(int i,int j) { return a[i][j]+=(i==n ? 0: max((solve(i+1,j),solve(i+1,j+1))) } 遞迴效率低下 法二:本題解 法三:記憶化搜尋 本題分為兩部分首先將d陣列初始化-1然後遞迴 int solve(int i,int j) { if(d[i][j]>=0)return d[i][j]; return a[i][j]+=(i==n ? 0: max((solve(i+1,j),solve(i+1,j+1))) }