算法 动态规划
来源:互联网 发布:cn域名 国外空间 编辑:程序博客网 时间:2024/06/11 23:09
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))) }
阅读全文
0 0
- 算法--动态规划算法
- 动态规划算法剖析
- 动态规划算法
- 初识动态规划算法
- 动态规划算法
- 动态规划算法剖析
- 动态规划算法
- 动态规划算法剖析
- 动态规划算法
- 动态规划算法实现
- 动态规划算法
- 动态规划算法
- 动态规划算法之一
- 动态规划算法备忘
- 动态规划 --压缩算法
- 动态规划算法
- 动态规划算法
- 动态规划算法解析
- 数据防泄密(DLP)系统
- 如果出现run-init:/sbin/init:No such file or directory
- JavaScript基础
- 水仙花数
- CTF writeup之pwn2own warehouse
- 算法 动态规划
- 如何写出好代码(一)
- Lintcode161 Rotate Image solution 题解
- 爬虫爬取完本小说
- HDU
- 【Flashback】启用Flashback Database闪回数据库功能
- C++多继承
- css3中的滤镜特效
- Android assets中json文件的使用