夏季每日一题打卡day3 —— AcWing 3499. 序列最大收益
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了夏季每日一题打卡day3 —— AcWing 3499. 序列最大收益相关的知识,希望对你有一定的参考价值。
AcWing 3499. 序列最大收益
【题目描述】
【思路】
状态表示:
f[i][j] 表示前i个数中删除j个且保留第i个数的所有删除方案的集合,其值为所有方案中最大的收益。
状态转移,以倒数第二个可以是哪个数(空集、1 、 2 …… i - 1)来划分集合,一共有i个子集(状态转移)。在所有子集中取最大者即为,f[i][j]最大收益。
import java.util.Scanner;
public class Main{
static int N = 210;
static int a[] = new int[N];
static int s[][] = new int[N][N];
static int f[][] = new int[N][N];
public static void main(String args[]){
Scanner reader =new Scanner(System.in);
int n = reader.nextInt(), t = reader.nextInt(), m = reader.nextInt();
for(int i = 1; i <= m; i ++) a[i] = reader.nextInt();
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++){
s[i][j] = reader.nextInt();
}
//初始化 因为结果可能为0
for(int i = 1; i < N; i ++)
for(int j = 1; j < N; j ++)
f[i][j] = -1;
//前1个中删除0个的方案数是0
f[1][0] = 0;
for(int i = 2; i <= m; i ++)
for(int j = 0; j <= t; j ++){
//遍历f[i][j]的所有子集 取max
for(int k = 1; k < i; k ++){
if( j >= i - k - 1)
f[i][j] = Math.max(f[i][j], f[k][j - (i - k - 1)] + s[ a[k] ][ a[i] ] ) ;
}
}
//删除最多 k 个元素
int res = 0;
for(int i = 0; i <= t; i ++)
if( f[m][i] > res ) res = f[m][i];
System.out.println(res);
}
}
以上是关于夏季每日一题打卡day3 —— AcWing 3499. 序列最大收益的主要内容,如果未能解决你的问题,请参考以下文章
ACWing夏季每日一题打卡day —— AcWing 3493. 最大的和
夏季每日一题打卡day4 —— AcWing 3502. 不同路径数