dp小试
来源:互联网 发布:fifa online3新数据库 编辑:程序博客网 时间:2024/06/14 06:55
题目一:
将一个由N行数字组成的三角形,如图所以,设计一个算法,计算出三角形的由顶至底的一条路径,使该路径经过的数字总和最大。
则可以得到状态转移方程:
f[i][j] = max(f[i+1][j], f[i+1][j+1]) + map[i][j]
import java.util.*;public class Main { static Scanner in = new Scanner(System.in);public static void main(String[] args) {int[][] a = new int[10][10]; int n = in.nextInt(); for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {a[i][j]=in.nextInt();}} for (int i = n-1; i >= 0; i--) {for (int j = 0; j < i; j++) {a[i-1][j]+=Math.max(a[i][j],a[i][j+1]);}} System.out.println(a[0][0]);}}题目二:
一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度。
那么d(i)可以用下面的状态转移方程得到:
d(i) = max{1, d(j)+1},其中j<i,A[j]<=A[i]
用大白话解释就是,想要求d(i),就把i前面的各个子序列中,最后一个数不大于A[i]的序列长度加1,然后取出最大的长度即为d(i)。当然了,有可能i前面的各个子序列中最后一个数都大于A[i],那么d(i)=1,即它自身成为一个长度为1的子序列。
import java.util.*;public class Main { static Scanner in = new Scanner(System.in);public static void main(String[] args) {int[] a = new int[100];int[] dis = new int[100];int res=0; int n = in.nextInt(); for (int i = 0; i < n; i++) {a[i]=in.nextInt();} for (int i = 0; i < n; i++){ dis[i] = 1;for (int j = 0; j < i; j++){if(a[j]<a[i])dis[i]=Math.max(dis[i], dis[j]+1);}res = Math.max(res, dis[i]);} System.out.println(res);}}这里我附上一个大佬的学习链接:
题目三:
最长上升公共子序列问题:
问题描述
什么是最长公共子序列呢?好比一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。
举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。
3.1、最长公共子序列的结构
最长公共子序列的结构有如下表示:
设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,则:
1. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
2. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
3. 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn-1>,Zk-1=<z1, z2, …, zk-1package aaa;import java.util.*;public class Main { static Scanner in = new Scanner(System.in);public static void main(String[] args) {int[][] dis = new int[100][100]; String s1 = in.next(); String s2 = in.next(); int a = s1.length(); int b = s2.length(); for (int i = 1; i <= a; i++) {for (int j = 1; j <= b; j++) {if(s1.charAt(i-1)==s2.charAt(j-1))dis[i][j]=dis[i-1][j-1]+1;else dis[i][j]=Math.max(dis[i-1][j], dis[i][j-1]);}} System.out.println(dis[a][b]);}}
http://blog.csdn.net/u013445530/article/details/45645307
- dp小试
- [DP] DeepLearning 小集锦
- DP 小总结
- POJ 2247 小DP?
- 状压DP小技巧
- 背包dp小tips
- 数位dp小练
- 状压dp小练
- 树形dp小练
- 区间dp小练
- dp小总结
- 区间dp 小小结
- 树形DP<小小结>
- 开心的小明(dp)
- 几个dp的小总结
- 小奇的矩阵 DP
- NYOJ - 开心的小明(经典dp)
- 小白dp uva 10271 - Chopsticks
- Python实现红黑树
- mybatis简单的增删改查————3
- 洛谷 P2341 [HAOI2006]受欢迎的牛
- Java之阻塞
- 【51Nod1494】选举拉票
- dp小试
- 交叉熵损失函数
- 深入理解计算机系统(CSAPP)读书总结
- hdu 1166 敌兵布阵 线段树
- 用Docker解决坑爹的环境搭建系列——PHP+Apache2
- 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。
- android开发艺术探索 第一章
- requirejs基础
- 微信小程序登录逻辑整理