动态规划经典题目

版权声明:转载标明来源! 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);
}
}

}

猜你喜欢

转载自blog.csdn.net/qq_39213969/article/details/89222506