DP:地头蛇PIPI

本文介绍了如何使用动态规划解决一个关于收取保护费的问题,即地头蛇PIPI问题。通过设立DP[i]表示在第i家商家收取保护费的前提下,前i家商家的最大收益,利用状态转移方程DP[i]=max(DP[i-2],DP[i-3])+a[i],最终找到DP[n]与DP[n-1]中的较大值作为答案。代码示例展示了具体的实现过程。
摘要由CSDN通过智能技术生成

DP:地头蛇PIPI

问题

在这里插入图片描述
在这里插入图片描述

思路

  我们首先有一个自然而然的想法,我们设DP[i]为1~i这些商家能收取的最大保护费。但这样设状态我们不知道最后收取了到底是哪一家的保护费,不好进行状态的转移。因此,我们把DP[i]设为:一定收取了第i个商家保护费的情况下,1 ~ i这些商家能收取的最大保护费。收取了第i个商家的保护费,那么第i-1个商家的保护费就不能收取了,那么DP[i]看起来是从DP[i-2],DP[i-3],…,DP[1]这里面转移过来,但实际上DP[i]只能从DP[i - 2]或DP[i - 3]转移得到,因为对于第i - 2个商家和第i - 3个商家,我们总能收取其中一个的保护费,而且一定要收。举个例子,若DP[i]是从DP[i-4]转移,那么第i-1/i-2/i-3个商家的保护费都不收了。而我们完全可以多收第i-2个商家的保护费,为什么不选择多收呢?因此并不需要从i-2遍历到1选出最大值,i-2~1中的最大值必然是DP[i-2]与DP[i-3]其中之一。设a[i]表示从第i家商家收取的保护费,我们得到状态转移方程为:
  DP[i]=max(DP[i-2],DP[i-3])+a[i]
  最终答案就是DP[n]与DP[n-1]中的较大值

代码

import java.util.*;

public class Main {
    static int[] dp = new int[100005];
    static int[] price = new int[100005];
    public static void main(String[] args) {
        int n, i;
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            n = scanner.nextInt();
            for (i = 0;i < n;i++) {
                price[i] = scanner.nextInt();
            }
            dp[0] = price[0];
            if (n >= 2) {
                dp[1] = price[1];
            }
            if (n >= 3) {
                dp[2] = dp[0] + price[2];
            }
            for (i = 3;i < n;i++) {
                dp[i] = Math.max(dp[i - 2], dp[i - 3]) + price[i];
            }
            System.out.println(n >= 2 ? Math.max(dp[n - 1], dp[n - 2]) : n >= 1 ? dp[n - 1] : 0);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happy19991001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值