https://blog.csdn.net/wdays83892469/article/details/79763421
一些关于动态规划和游戏最大伤害的题目和解法。
- 动态规划——卡牌游戏最大伤害_eck_燃的博客-CSDN博客 这篇博客介绍了一个卡牌游戏的问题,给出了暴力递归和动态规划的两种解法,以及代码实现和注释。
- 动态规划之博弈问题 - 知乎 这篇文章给出了解决博弈问题的动态规划解法。博弈问题的前提一般都是在两个聪明人之间进行,编程描述这种游戏的一般方法是二维 dp 数组,数组中通过元组分别表示两人的最优决策。
- 告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打 … 这篇文章总结了动态规划的一些常见套路和技巧,以及 40 道题目的链接和思路。
最大伤害
某游戏是一个卡牌类游戏,玩家通过战斗或抽牌可以拿到一些技能牌,每张技能牌都有对应的伤害值(伤 害值>=0),
当你有了组合技属性之后,你可以在自己手头上选择任意张技能牌, 以组合技的方式来攻击 boss,
组合技的总伤害将等于所组合的各张技能牌的伤害值的乘积(只有一张牌时,组合技伤害值等于这张牌 本身的伤害值),
但是能发动组合技必须有个前提:所有被选择的技能牌的伤害系数之和必须等于m(m>0)
以解开封印; 你为了能赢得最终胜利,需要在所有技能牌中挑出若干张技能牌触发组合技(每张牌只能用一 次),
以形成最大威力的组合技攻击效果。 例如:你有伤害值分别为1,2,3,4,5的五张牌,给定的解开封印的阈值(m)为10,
那形成最大组合攻击效果 的组合为30(532),而不是24(4321),也不是20(541),需要输出的结果即30。
递归与动态规划专题 (17条消息) 递归与动态规划专题_动态规划和递归培养什么能力_eck_燃的博客-CSDN博客
//暴力递归加动态规划 public class Max_Damage { //method1 暴力递归 public static int getMax(int arr[],int sum) { return process(arr,0,sum); } public static int process(int arr[],int index,int sum) { //base case if (sum<0) { return -1;//无效值 } if (arr.length==index) { return sum==0?1:-1;//1乘别的数不受影响 sum==0说明选取了一种合理方案,然后用sum*答案 如果是不合理方案返回-1 } int notInclude=process(arr, index+1, sum);//1-index 不选取某个数 int include=arr[index]*process(arr, index+1, sum-arr[index]);//选取某个数 return Math.max(notInclude, include); } //method2 dp public static int maxDamage(int[] arr, int threshold) { if (arr == null || arr.length == 0) { return 0; } int[][] dp = new int[arr.length][threshold + 1]; if (arr[0] <= threshold) { dp[0][arr[0]] = arr[0]; } for (int i = 1; i < arr.length; i++) { for (int j = 0; j <= threshold; j++) { int no = dp[i - 1][j]; int only = j - arr[i] == 0 ? arr[i] : 0; int part = j - arr[i] > 0 ? dp[i - 1][j - arr[i]] * arr[i] : 0; dp[i][j] = Math.max(no, Math.max(only, part)); } } // printMatrix(dp); // 可以打印dp看看 return dp[dp.length - 1][dp[0].length - 1]; } public static void printMatrix(int[][] dp) { for (int i = 0; i < dp.length; i++) { for (int j = 0; j < dp[0].length; j++) { System.out.print(dp[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; int threshold = 10; System.out.println(maxDamage(arr, threshold)); System.out.println(getMax(arr, threshold)); } }