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也增加