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)))
}
递归效率低下参见图9-2
法二:本题解
法三:记忆化搜索 本题分为两部分首先将d数组初始化-1然后递归参见图9-3
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)))
}
算法 动态规划
猜你喜欢
转载自blog.csdn.net/wangzhaoweng/article/details/78618873
今日推荐
周排行