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=ynZk-1Xm-1Yn-1的最长公共子序列;

2. xm≠ynzk≠xZXm-1Y的最长公共子序列;

3. xm≠ynzk≠yn ,则ZXYn-1的最长公共子序列。

    其中Xm-1=<x1, x2, …, xm-1>Yn-1=<y1, y2, …, yn-1>Zk-1=<z1, z2, …, zk-1

package 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


原创粉丝点击