DP来一波

Posted 猪八戒1.0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP来一波相关的知识,希望对你有一定的参考价值。

目录

题目1---摘花生

 分析

代码

题目2---最长上升子序列

分析 

代码

题目3---地宫取宝

分析 

 代码


题目1---摘花生

1015. 摘花生 - AcWing题库

 分析

代码



import java.util.Scanner;

public class Main 
	static int N=1010;
	static int w[][]=new int[N][N];
	static int f[][]=new int[N][N];
	static int T,n,m;
	public static void main(String[] args) 
		Scanner sc = new Scanner(System.in);
		T=sc.nextInt();
		while(T-->0) 
			n=sc.nextInt();
			m=sc.nextInt();
			for(int i=1;i<=n;i++) 
				for(int j=1;j<=m;j++) 
					w[i][j]=sc.nextInt();
				
			
			for(int i=1;i<=n;i++) 
				for(int j=1;j<=m;j++) 
					f[i][j]=Math.max(f[i-1][j], f[i][j-1])+w[i][j];
				
			
			System.out.println(f[n][m]);
		
	

题目2---最长上升子序列

 

分析 

代码


import java.util.Scanner;

public class Main 
	static int N=1010;
	static int res;
	static int a[]=new int[N];
	static int f[]=new int[N];
	public static void main(String[] args) 
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		for(int i=1;i<=n;i++) 
			a[i]=sc.nextInt();
		
		for(int i=1;i<=n;i++) 
			f[i]=1;
			for(int j=1;j<n;j++) 
				if(a[j]<a[i]) 
					f[i]=Math.max(f[i], f[j]+1);
				
			
		
		for(int i=1;i<=n;i++) 
			res=Math.max(f[i], res);
		
		System.out.println(res);
	

题目3---地宫取宝

1212. 地宫取宝 - AcWing题库

  

分析 

是上面两个题的综合,好难呀

 代码


import java.util.Scanner;

public class Main 
	static int n,m,k;
	static int N=55;
	//int最大只能表示2*10九次方
	static int MOD=1000000007; 
	static int w[][]=new int[N][N];
	//f[i,j,k,c] c是从0-12 还有一个-1 一共13个数
	static int f[][][][]=new int[N][N][13][14]; 
	public static void main(String[] args) 
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		k=sc.nextInt();
		for(int i=1;i<=n;i++) 
			for(int j=1;j<=m;j++) 
				w[i][j]=sc.nextInt();
				w[i][j]++;
			
		
		//第一件取
		f[1][1][1][w[1][1]]=1;
		/*第一件不取 本来应该是f[1,1,0,-1]
		 * 但由于下标不能是负数
		 * 但是在上面w[i][j]++了就不会存在值为0
		 * are you ok
		 */
		f[1][1][0][0]=1;
		//4维4重循环dp
		for(int i=1;i<=n;i++) 
			for(int j=1;j<=m;j++) 
				//u件数
				for(int u=0;u<=k;u++) 
					//v价值
					for(int v=0;v<=13;v++) 
						int val=f[i][j][u][v];
						//不取的两种情况
						val=(val+f[i-1][j][u][v])%MOD;
						val=(val+f[i][j-1][u][v])%MOD;
						//取的两种情况,但此时要遍历v
						if(u>0&&v==w[i][j]) 
							for(int c=0;c<v;c++) 
								val=(val+f[i-1][j][u-1][c])%MOD;
								val=(val+f[i][j-1][u-1][c])%MOD;
							
						
						f[i][j][u][v]=val;
					
				
			
		
		int res=0;
		for(int i=0;i<=13;i++) 
			res=(res+f[n][m][k][i])%MOD;
		System.out.println(res);
	

以上是关于DP来一波的主要内容,如果未能解决你的问题,请参考以下文章

算法面试专题-动态规划

算法动态规划DP自学笔记 入门:基本知识+经典例题

动态规划 算法(DP)

强化学习用动态规划(DP)求解

关于DP与背包

关于DP和背包