算法 路灯

本文探讨了如何使用算法解决最少路灯照明全部区域的问题,并提出了一种基于动态规划的解决方案。同时,文章还涉及如何以最低成本实现主播人气值从a到b的提升,通过分析不同打赏形式的成本效益,采用广度优先搜索和有序表策略来优化打赏策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

X是物体,。是空白地区,可以在空白地区防止路灯,一个路灯可以照明左右位置,求最少多少个路灯可以照明全部。

public static int minLight(String s){
        char[] str = s.toCharArray();
        int index = 0;
        int light = 0;
        while(index < str.length){
            if(str[index] == 'X'){
                index++;
            }else {//.的情况
                light++;
                if(index + 1 == str.length){
                    break;
                }else {
                    if (str[index + 1] == 'X'){
                        index = index + 2;
                    }else{//如果下一个位置是.的情况
                        index = index + 3;
                    }
                }
            }
            
        }
        return  light;
    }

打赏主播,主播想要人气值b,主播现在的人气值是a,且a和b都是偶数,打赏主播有三种形式,增加2点人气,需要xx元,减少两点人气xxx元,人气x2 需要xxxx元,怎么样花钱最少打赏主播

/**
     *
     * @param preMoney 之前花了多少钱 可变
     * @param aim aim 目标 可变
     * @param add  +2 需要的钱数
     * @param times x2 需要的钱数
     * @param del -2 需要的钱数
     * @param cur 当前的人气
     * @param limitAim 人气达到什么程度就不增加了 *2
     * @param limitCoin 已经使用的币大到什么程度不需要尝试 ((end-start)/2)*add) 一般的方法 需要多少个2的钱数
     * @return
     */
    public static int process(int preMoney,int aim,
                              int add,int times,int del,
                              int cur,
                              int limitAim,int limitCoin){
        if(preMoney > limitCoin){
            return Integer.MAX_VALUE;
        }
        if(cur < 0){
            return Integer.MAX_VALUE;
        }
        if(cur > limitAim){
            return Integer.MAX_VALUE;
        }
        if(aim == cur){
            return preMoney;
        }

        int min = Integer.MIN_VALUE;
        //让人气+2
        int p1 = process(preMoney + add,aim,add,times,del,cur+2,limitAim,limitCoin);
        if(p1 != Integer.MAX_VALUE){
            min = p1;
        }
        int p2 = process(preMoney + del,aim,add,times,del,cur-2,limitAim,limitCoin);
        if(p2!=Integer.MAX_VALUE){
            min = p2;
        }
        int p3 = process(preMoney+times,aim,add,times,del,cur *2,limitAim,limitCoin);
        if(p3 != Integer.MAX_VALUE){
            min = p3;
        }
        return min;
    }
//动态规划  不懂
    public static int minCoins2(int add,int times,int del,int start,int end){
        if(start > end){
            return -1;
        }
        int limitCoin = ((end-start)/2)*add;
        int limitAim = end * 2;
        int[][] dp = new int[limitCoin + 1][limitAim + 1];
        for(int pre = 0; pre <= limitCoin;pre++){
            for(int aim = 0;aim <= limitAim;aim++){
                if(aim == start){
                    dp[pre][aim] = pre;
                }else{
                    dp[pre][aim] = Integer.MAX_VALUE;
                }
            }
        }

        for(int pre = limitCoin;pre >= 0;pre--){
            for(int aim = 0;aim <=limitAim;aim++){
                if(aim -2 >= 0 && pre + add <= limitCoin){
                    dp[pre][aim] = Math.min(dp[pre][aim],dp[pre+add,aim-2]);
                }
                if(aim + 2 <= limitAim && pre+del <= limitCoin){
                    dp[pre][aim] = Math.min(dp[pre][aim],dp[pre+del][aim+2]);
                }
                if( (aim & 1) == 0){
                    if(aim / 2 >= 0 && pre + times <= limitCoin){
                        dp[pre][aim] = Math.min(dp[pre][aim],dp[pre+times][aim/2]);
                    }
                }
            }
            return dp[0][end];
        }

在这里插入图片描述
思路,每个节点保留key和value的有序表,key代表需要的天数,value代表收益,倒着广度优先遍历,依次往前传递,有序表满足key增加,value也增加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值