动态规划-蓝桥杯-健身

这是一个完全背包的题,可以利用完全背包来解决。

java 复制代码
//package com.js.datastructure.recursion.蓝桥.国特训练营.动态规划线性DP;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int[] kkk = new int[21];
        kkk[0] = 1;
        for (int i = 1; i < 21; i++) {
            kkk[i] = kkk[i-1] * 2;
        }
        //1~n天中选择一些日子健身
        //有m个健身计划,第i个健身计划,需要2^ki天,获得健身增益si
        //有q天有其他安排
        //
        
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int q = scanner.nextInt();

        int[] t = new int[q];

        for (int i = 0; i < q; i++) {
            t[i] = scanner.nextInt();
        }
        
        int[] k = new int[m];
        int[] s = new int[m];

        //记录值
        for (int i = 0; i < m; i++) {
            k[i] = kkk[scanner.nextInt()];
            s[i] = scanner.nextInt();
        }
        
        //定义dp[i]为间隔天数为i时的最大收益数,转化为完全背包,正序遍历
        long[] dp = new long[n+1];
        for (int i = 0; i < m; i++) {
            if(k[i] > n){
                continue;
            }
            dp[k[i]] = Math.max(s[i],dp[k[i]]);
            for (int j = 0; j < n+1; j++) {
                if(dp[j] != 0 && j + k[i] < n+1){
                    dp[j + k[i]] = Math.max(dp[j] + s[i],dp[j + k[i]]);
                }
            }
        }

        //处理dp数组,满足题目中的
        int now = 0;
        for (int i = 0; i < n + 1; i++) {
            if(dp[i] != 0){
                now = i;
            }else {
                dp[i] = dp[now];
            }
        }


        //把时间段摘出来,进行填充
        ArrayList<Integer> time = new ArrayList<>();
        time.add(t[0] - 1);
        for (int i = 1; i < q; i++) {
            time.add(t[i] - t[i-1] - 1);
        }
        time.add(n - t[q-1]);

        long ans = 0;
        for(int tt : time){
            ans = ans + dp[tt];
        }
        System.out.println(ans);
    }
}
相关推荐
程序员Xu14 分钟前
【LeetCode热题100道笔记】腐烂的橘子
笔记·算法·leetcode
天选之女wow20 分钟前
【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II
数据结构·算法·leetcode·链表
THMAIL1 小时前
量化基金从小白到大师 - 金融数据获取大全:从免费API到Tick级数据实战指南
人工智能·python·深度学习·算法·机器学习·金融·kafka
纪元A梦2 小时前
贪心算法应用:数字孪生同步问题详解
java·算法·贪心算法
纪元A梦2 小时前
贪心算法应用:食品生产线排序问题详解
算法·贪心算法
信奥卷王2 小时前
2024年9月GESPC++三级真题解析(含视频)
算法
望未来无悔3 小时前
系统学习算法 专题十八 队列+宽搜
java·算法
xz2024102****3 小时前
最大似然估计:损失函数的底层数学原理
人工智能·算法·机器学习·概率论
Xの哲學3 小时前
Linux RCU (Read-Copy-Update) 机制深度分析
linux·网络·算法·架构·边缘计算
数模加油站4 小时前
25高教社杯数模国赛【C题国一学长思路+问题分析】第二弹
算法·数学建模·数模国赛·高教社杯全国大学生数学建模竞赛