`
sole
  • 浏览: 141543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态规划算法练习

阅读更多

 

【问题描述】 
某国度的人,喜欢玩这样一个游戏,在一块板上写着一行数,共n个。两个游戏者,轮流从最右或最左取一个数。刚开始,每个游戏者的得分均为20。如果一个游戏者取下一个数,则将该数的值加到该游戏者的得分上,最后谁的得分最高谁就赢了游戏。给出这n个数( 从左往右), 假设游戏者都是非常聪明的,问最后两个人的得分(假设第一个人首先取数)。 
【输入】 
输入格式:第一行为n(2<=n<=100),第二行为n个数,每个数字之间均用空格隔开。 
【输出】 
输出为两个游戏者的得分。第一个数表示第一个游戏者的得分,第二个数为第二个游戏者的得分,两个数字之间用空格隔开。 

程序运行后结果示例: 
【样例输入】 

4 7 2 9 5 2 
【样例输出】 
38 31

 

 

写道
public class ScoreGame {

/**
* @param args
*/
public static void main(String[] args) {
Integer[] examp = new Integer[]{4,7, 2, 9, 5, 2};

LinkedList<Integer> queue = new LinkedList<Integer>();
queue.addAll(Arrays.asList(examp));

int scoreA = scoreFirst(queue)+20;
int scoreB = calcSum(queue)-scoreA+20;
System.out.println("A的得分: "+scoreA);
System.out.println("B的得分: "+scoreB);
}

public static int scoreFirst(Deque<Integer> queue){
if(queue.size()<2)
throw new IllegalArgumentException("数组个数不能小于2");
if(queue.size()==2){
int first = queue.pollFirst();
int last = queue.pollLast();
return first>=last?first:last;
}else{
int sum = calcSum(queue);

LinkedList<Integer> pollFirstQueue = new LinkedList<Integer>(queue);
pollFirstQueue.pollFirst();
int result1 = sum - scoreFirst(pollFirstQueue);

LinkedList<Integer> pollLastQueue = new LinkedList<Integer>(queue);
pollLastQueue.pollLast();
int result2 = sum - scoreFirst(pollLastQueue);

return result1>result2?result1:result2;
}
}

public static int calcSum(Deque<Integer> queue){
int sum = 0;
for(Integer i:queue){
sum+=i;
}
return sum;
}
}
运行结果:
A的得分: 38
B的得分: 11
程序还有很多地方可以优化。欢迎大家探讨

 


 

没有用双端队列的做法: 
public static int scoreFirst2(int[] array, int sIndex, int eIndex) { 
if (eIndex - sIndex < 1) 
throw new IllegalArgumentException("数组个数不能小于2"); 
if (eIndex - sIndex == 1) { 
int first = array[sIndex]; 
int last = array[eIndex]; 
return first >= last ? first : last; 
} else { 
int sum = calcSum(array, sIndex, eIndex); 
int result1 = sum - scoreFirst2(array, sIndex + 1, eIndex); 
int result2 = sum - scoreFirst2(array, sIndex, eIndex - 1); 
return result1 > result2 ? result1 : result2; 
} 
} 

public static int calcSum(int[] array, int s, int e) { 
int sum = 0; 
for (int i = s; i <= e; ++i) { 
sum += array[i]; 
} 
return sum; 
}

 

分享到:
评论

相关推荐

    DP算法即动态规划算法集锦

    标题中的“DP算法即动态规划算法集锦”,暗示我们将探讨一系列动态规划的经典案例,这些案例可能包括但不限于背包问题、最长公共子序列、最短路径问题、字符串匹配等。动态规划能够处理具有重叠子问题和最优子结构的...

    国际大学生程序设计竞赛例题解.三:图论、动态规划算法、综合题专集

    三:图论、动态规划算法、综合题专集》是一本专门针对编程竞赛中的重要算法与问题解决策略的书籍。它涵盖了图论、动态规划以及综合题型,这些都是在竞赛中经常遇到并且至关重要的主题。下面将对这三个方面进行详细的...

    动态规划专项练习

    动态规划是一种重要的算法思想,广泛应用于计算机科学,特别是在解决最优化问题时。它通过将大问题分解为子问题,然后逐步构建解决方案,从而避免了重复计算,提高了效率。本专项练习旨在深入理解和熟练掌握动态规划...

    动态规划算法_百度百科

    【动态规划算法】是一种在运筹学中广泛应用的数学方法,由美国数学家R.E.Bellman在20世纪50年代初期提出。它主要针对多阶段决策过程的优化问题,通过将复杂问题分解为一系列相互关联的子问题,逐个解决以达到全局...

    计算机算法设计课件(包含贪心算法,动态规划算法等等)

    在本课件中,主要探讨了两种关键的算法设计技术:贪心算法和动态规划算法,这些都是计算机科学教育中的重要主题。 **贪心算法**是一种解决问题的方法,它通过在每一步选择局部最优解来试图找到全局最优解。贪心算法...

    动态规划入门练习题

    动态规划入门练习题 标题:动态规划入门练习题 描述:关于动态规划的一些题目,值得一做。 标签:ACM 动态规划 本文档提供了四个动态规划入门练习题,...解决这些问题需要使用动态规划算法,以找到最优的解决方案。

    动态规划练习(pascal)

    在这个"动态规划练习(pascal)"的资源中,我们重点探讨的是如何利用Pascal语言来实现动态规划算法。Pascal是一种结构化编程语言,它清晰的语法结构使得学习和应用动态规划算法变得相对直观。 动态规划的核心是将一个...

    算法参考资料国际大学生程序设计竞赛例题解3图论·动态规划算法·综合题专集

    标题中提到的是“算法参考资料国际大学生程序设计竞赛例题解3 图论·动态规划算法·综合题专集”。这份资料集中的标题揭示了内容的几个关键点,即它是一份专门为解决算法问题而编写的参考资料,特别针对国际大学生...

    动态规划算法入门指南:从斐波那契数列到爬楼梯问题

    ### 动态规划算法入门指南:从斐波那契数列到爬楼梯问题 #### 一、动态规划算法概述 动态规划(Dynamic Programming,简称DP)是一种强大的算法思想和技术,常用于解决各种优化问题,例如寻找最优解或最大化/最小...

    算法设计练习:动态规划习题大全

    可以使用动态规划算法,定义一个二维数组 dp,其中 dp[i][j] 表示前 i 个物品中选择 j 个物品的最大价值。然后,使用递推公式 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中 w[i] 是第 i 个物品的体积...

    基于Python语言的“算法分析”课程设计——以动态规划算法为例.pdf

    总之,基于Python的“算法分析”课程设计通过动态规划算法的实例,旨在帮助学生深入理解动态规划的思想,掌握其在实际问题中的应用,并提升编程技能。通过学习,学生将能够独立解决复杂的问题,运用动态规划方法找到...

    动态规划练习题

    本资源"动态规划练习题"集合了作者多年积累的题目,旨在帮助学习者深入理解和熟练掌握动态规划算法。 动态规划(Dynamic Programming,简称DP)的核心在于将复杂问题分解为相互重叠的子问题,并通过存储和重用子...

    规划算法-拉瓦利.rar

    6. **最新研究进展**:作者会分享一些规划算法领域的前沿研究,包括机器学习在规划中的应用、多智能体协同规划以及自适应规划策略等,为读者提供了研究动态和未来趋势的视野。 通过阅读《规划算法-拉瓦利》,无论是...

    算法设计与分析之动态规划

    动态规划是一种强大的算法设计方法,尤其适用于解决具有重叠子问题和最优子结构的问题。它通过将复杂问题分解成更小的子问题来...第七章的内容很可能包括这些主题的实例和练习,帮助初学者巩固和拓展动态规划的知识。

    java算法练习代码code

    本篇文章将详细探讨基于Java的算法实践,主要以"java算法练习代码code"为背景,深入解析其中可能涵盖的知识点。 首先,我们需要理解算法的基本概念。算法是一系列明确的步骤,用于解决特定问题或执行特定任务。在...

    算法之动态规划初步(Java版)

    最后,不断练习是掌握动态规划的最好方式。可以通过LeetCode、HackerRank等在线平台找到各种动态规划题目进行实践。同时,阅读和理解他人的代码,以及参与算法讨论,都能够帮助我们深化对动态规划的理解。 总之,...

    动态规划_动态规划_

    动态规划是一种在计算机科学和数学中广泛使用的算法设计方法,特别是在优化问题中。它通过将大问题分解为更小的子问题来解决,通常这些子问题具有重叠性质,即相同的子问题可能会在不同的上下文中多次出现。动态规划...

    动态规划(游艇问题)

    动态规划(游艇问题) 数据输入: 第1 行中有1 个正整数n(n≤200),表示有n个游艇出租站。接下来的n-1 行是r(i,j),1≤i≤n。 结果输出: 程序运行结束时,输出从游艇出租站1 到游艇出租站n所需的最少租金。 输入...

    动态规划经典习题.pdf

    标题“动态规划经典习题.pdf”表明文档中涉及的是一系列动态规划的练习题,旨在帮助读者加深对动态规划算法的理解和应用。 描述中提到,动态规划是数据结构与算法练习的必备内容,也是针对OI(信息学奥林匹克竞赛)...

    算法专项练习--线型动态规划.ppt

    算法专项练习--线型动态规划.ppt

Global site tag (gtag.js) - Google Analytics