DP来一波
Posted 猪八戒1.0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP来一波相关的知识,希望对你有一定的参考价值。
目录
题目1---摘花生
分析
代码
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---地宫取宝
分析
是上面两个题的综合,好难呀
代码
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来一波的主要内容,如果未能解决你的问题,请参考以下文章