版权声明:转载标明来源! https://blog.csdn.net/qq_39213969/article/details/89222506
动态规划啊
(1)最长公共子序列:
package 动态规划;
import java.util.Scanner;
/**
* abcde
bcde
4
* @author Administrator
*
*/
public class Main最长公共子序列 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
char x[]=cin.next().toCharArray();
char y[]=cin.next().toCharArray();
int m=x.length;
int n=y.length;
int c[][]=new int[m+1][n+1];
for(int i=0;i<m;i++)c[i][0]=0;
for(int j=0;j<n;j++)c[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(x[i-1]==y[j-1])
{
c[i][j]=c[i-1][j-1]+1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
}
else{
c[i][j]=c[i][j-1];
}
}
}
System.out.println(c[m][n]);
}
}
}
(2)最长回文子串
package testself;
import java.util.Scanner;
/**
* abcdedcbade
abcdedcba
* @author Administrator
*
*/
public class Main最长回文子串 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String str=cin.nextLine();
char c[]=str.toCharArray();
int maxlen=1;
int start=0;
int i,j;
boolean b[][]=new boolean[str.length()][str.length()];
for(i=0;i<str.length();i++)
{
for( j=0;j<=i;j++)
{
if(i-j+1<2)
{
b[j][i]=c[j]==c[i];
}else {
b[j][i]=b[j+1][i-1]&&(c[j]==c[i]);
}
if(b[j][i]&&i-j+1>maxlen)
{
maxlen=i-j+1;
start=j;
}
}
}
System.out.println(str.substring(start,start+maxlen));
}
}
(3)最长上升子序列
package 动态规划;
import java.util.Arrays;
import java.util.Scanner;
public class Main最长上升子序列 {
/**
* 5
1 2 3 5 3
4
* @param args
*/
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
int n=cin.nextInt();
int num[]=new int[n+1];
int maxlen[]=new int[n+1];
for(int i=1;i<=n;i++)
{
num[i]=cin.nextInt();
maxlen[i]=1;
}
for(int j=1;j<=n;++j)
{
for(int k=j+1;k<=n;++k)
{
if(num[k]>num[j])
{
maxlen[k]=Math.max(maxlen[k], maxlen[j]+1);
}
}
}
Arrays.sort(maxlen);
System.out.println(maxlen[n]);
}
}
111111111111111:普通方法(最长上升子序列)
package 动态规划;
import java.util.Arrays;
import java.util.Scanner;
public class longup {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int num[]=new int[n];
int sum[]=new int[n];
for(int i=0;i<n;i++)
{
num[i]=cin.nextInt();
}
//int sum=0;
int temp=0;
for(int i=1;i<n;i++)
{
if(num[i]>num[i-1])
{
sum[temp]++;
}else {
temp++;
}
}
Arrays.sort(sum);
System.out.println(sum[n-1]+1);
}
}
(4)三角金字塔问题最和问题
package 动态规划;
import java.util.Scanner;
/**
* 5
1
2 3
3 4 5
4 5 6 7
6 7 8 9 10
26
* @author Administrator
*
*/
public class Maindp三角金字塔 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
int n=cin.nextInt();
int num[][]=new int[n+1][n+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
num[i][j]=cin.nextInt();
}
}
int answer[][]=new int [n+1][n+1];
for(int i=1;i<=n;i++)
{
answer[n][i]=num[n][i];
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
answer[i][j]=Math.max(answer[i+1][j], answer[i+1][j+1])+num[i][j];
}
}
System.out.println(answer[1][1]);
}
}
}
(5)0 1背包问题·
**许多年前,在泰迪的家乡,有一个人被称为“骨头收藏家”。 这个男人喜欢收集各种各样的骨头,比如狗的,牛的,还有他去了坟墓…
骨收集器有一个体积为V的大袋子,沿着他的收集之旅有很多骨头,显然,不同的骨骼有不同的价值和不同的体积,现在根据他的行程给出每个骨头的值,你能计算吗? 超出骨收集器可以获得的总价值的最大值?
输入
第一行包含整数T,个案数。
接下来是T个案例,每个案例有三行,第一行包含两个整数N,V,(N <= 1000,V <= 1000)表示骨骼的数量和他的包的体积。 第二行包含表示每个骨骼值的N个整数。 第三行包含表示每个骨骼体积的N个整数。
产量
每行一个整数表示总值的最大值(此数字将小于231)。
样本输入
1
5 10
1 2 3 4 5
5 4 3 2 1
样本输出
14**
import java.util.Scanner;
//http://acm.hdu.edu.cn/showproblem.php?pid=2602
public class Main {
static Scanner input = new Scanner(System.in);
static {
}
public static void main(String[] args) {
int count = input.nextInt();
for (int i = 0; i < count; i++) {
int n = input.nextInt();
int max = input.nextInt();
int[] values = new int[n];
int[] volumns = new int[n];
for (int j = 0; j < n; j++) {
values[j] = input.nextInt();
}
for (int j = 0; j < n; j++) {
volumns[j] = input.nextInt();
}
int[] result = new int[max + 1];
for (int j = 0; j < n; j++) {
int value = values[j];
int volumn = volumns[j];
for (int j2 = result.length - 1; j2 > -1; j2--) {
if (result[j2] != 0 && j2 + volumns[j] <= max && result[j2 + volumns[j]] < result[j2] + values[j]) {
result[j2 + volumns[j]] = result[j2] + values[j];
}
}
if (volumn <= max && result[volumn] < value) {
result[volumn] = value;
}
}
max = 0;
for (int j : result) {
if (max < j) {
max = j;
}
}
System.out.println(max);
}
}
}
(6)最大子段含下标
package 动态规划;
import java.util.Scanner;
public class Main最大子段含下标 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
int n=cin.nextInt();
int num[]=new int[n];
for(int i=0;i<n;i++)
{
num[i]=cin.nextInt();
}
int end=0;
int start=0;
int temp=0;
int maxsum=0;
int thissum=0;
for(int i=0;i<n;i++)
{
thissum=thissum+num[i];
if(thissum>maxsum)
{
end=i;
start=temp;
maxsum=thissum;
}
if(thissum<0)
{
temp=i+1;
thissum=0;
}
}
System.out.println((start+1)+" "+(end+1));
System.out.println(maxsum);
}
}
}