(Java实现) 活动选择
活动选择的类似问题都可以这么写
import java.util.ArrayList;
public class huodongxuanze {
/**
* //算法导论中活动选择问题动态规划求解
* @param s 活动的开始时间
* @param f 活动的结束时间
* @param n 活动数目
* @return 最大兼容的活动个数
*/
public static int maxCompatiableActivity(int[] s, int[] f, int n){
int[][] c = new int[n + 2][n + 2];
for(int j = 0; j <= n+1; j++)
for(int i = n+1; i >= j; i--)
c[i][j] = 0;//if i>=j S(i,j)是空集合
int maxTemp = 0;
for(int j = 1; j <= n+1; j++)
{
for(int i = 0; i < j; i++)//i < j
{
for(int k = i+1; k < j; k++)// i< k <j
{
if(s[k] >= f[i] && f[k] <= s[j])//S(i,j)不空
{
if(c[i][k] + c[k][j] + 1 > maxTemp)
maxTemp = c[i][k] + c[k][j] + 1;
}
}//inner for
c[i][j] = maxTemp;
maxTemp = 0;
}//media for
}//outer for
return c[0][n+1];
}
//贪心算法的递归解
public static ArrayList<Integer> greedyActivitySelection(int[] s, int[] f, int i, int n, ArrayList<Integer> activities){
//初始调用时 i = 0, 所以a(1)是必选的(注意:活动编号已经按结束时间排序)
int m = i + 1;
//s[m] < f[i] 意味着活动 a(m) 与 a(i)冲突了
while(m <= n && s[m] < f[i])
m++;//选择下一个活动
if(m <= n){
activities.add(m);
greedyActivitySelection(s, f, m, n, activities);
}
return activities;
}
//贪心算法的非递归解, assume f[] has been sorted and actId 0/n+1 is virtually added
public static ArrayList<Integer> greedyActivitySelection2(int[] s, int[] f, int n, ArrayList<Integer> acitivities){
//所有真正的活动(不包括 活动0和 活动n+1)中,结束时间最早的那个活动一定是最大兼容活动集合中的 活动.
int m = 1;
acitivities.add(m);
for(int actId = 2; actId <= n; actId++){
if(s[actId] >= f[m])//actId的开始时间在 m 号活动之后.--actId 与 m 没有冲突
{
m = actId;
acitivities.add(m);
}
}
return acitivities;
}
//for test purpose
public static void main(String[] args) {
//添加了 a(0) 和 a(n+1)活动. 其中s(0)=f(0)=0, s(n+1)=f(n+1)=Integer.MAX_VALUE
int[] s = {0,1,3,0,5,3,5,6,8,8,2,12,Integer.MAX_VALUE};//start time
int[] f = {0,4,5,6,7,8,9,10,11,12,13,14,Integer.MAX_VALUE};//finish time
int n = 11;//活动的个数
int result = maxCompatiableActivity(s, f, n);
System.out.println("最大兼容活动个数: " + result);
ArrayList<Integer> acts = new ArrayList<Integer>();
greedyActivitySelection(s, f, 0, n, acts);
for (Integer activityId : acts)
System.out.print(activityId + " ");
System.out.println();
ArrayList<Integer> acts2 = new ArrayList<Integer>();
greedyActivitySelection2(s, f, n, acts2);
for (Integer activityId : acts2)
System.out.print(activityId + " ");
}
}
(Java实现) 活动选择的更多相关文章
- 基于visual Studio2013解决算法导论之049活动选择问题
题目 活动选择问题 解决代码及点评 // 活动选择问题.cpp : 定义控制台应用程序的入口点. // #include<iostream> #define N 100 using ...
- java 弹出选择目录框(选择文件夹),获取选择的文件夹路径
java 弹出选择目录框(选择文件夹),获取选择的文件夹路径 java 弹出选择目录框(选择文件夹),获取选择的文件夹路径:int result = 0;File file = null;String ...
- C#、C++、Java、Python 选择哪个好?
C#.C++.Java.Python 选择哪个好? 2019年03月06日 16:54:34 编程小火车 阅读数:214 首先排除Python,光动态语言一个理由,就已经万劫不复了.无论有多少所谓 ...
- dp - 活动选择问题
算法目前存在问题,待解决.. 活动选择问题是一类任务调度的问题,目标是选出一个最大的互相兼容的活动集合.例如:学校教室的安排问题,几个班级需要在同一天使用同一间教室,但其中一些班级的使用时间产生冲突, ...
- 【java基础】选择排序and冒泡排序
前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...
- Java实现简单选择排序
package select; import java.util.Scanner; /*采用最简单的选择方式:从头到尾扫描序列找出最小的记录和第一个记录交换,接着在剩下的记录中继续这种选择和交换,最终 ...
- 【Java SE】如何用Java实现直接选择排序
摘要:直接选择排序属于选择排序的一种,但是它的排序算法比冒泡排序的速度要快一些,由于它的算法比较简单,所以也比较适合初学者学习掌握. 适宜人群:有一定Java SE基础,明白Java的数据类型,数组的 ...
- Java客户端工具选择:HTML?Swing?XML?
整理下面的文章是因为个人觉得写的很好,关于java的客户端了解也并不是太多.看了下面的文章觉得很有必要贴出来,方便自己以后了解java客户端编程. Java软件设计师和管理人员经常会面临这样的难题:在 ...
- Java集合的选择
我们在使用集合时应该使用哪个集合呢? 具体还是要看需求, 当然, Java中不只是有这几个, 还有一些没有给出, 具体情况具体分析吧, 仅给出一个小思路. 进行集合的选择: 是否是键值对象形式: 一 ...
随机推荐
- CSS躬行记(10)——CSS方法论
方法论是一个哲学术语,会对一系列具体的方法进行分析研究.系统总结并最终提出较为一般性的原则.CSS方法论是一种面向CSS.由个人和组织设计.已被诸多项目检验且公认有效的最佳实践.这些方法论都会涉及结构 ...
- 【Hadoop离线基础总结】数据仓库和hive的基本概念
数据仓库和Hive的基本概念 数据仓库 概述 数据仓库英文全称为 Data Warehouse,一般简称为DW.主要目的是构建面向分析的集成化数据环境,主要职责是对仓库中的数据进行分析,支持我们做决策 ...
- JDBC07 事务
事务 事务基本概念 一组要么同时执行成功,要么同时执行失败的SQL语句,是数据库操作的一个执行单元(比如:银行中,对账户的操作和日志的记录是一组事务) 事务开始于: -连接到数据库上,并执行一条DML ...
- 学会阅读源码后,我觉得自己better了
我有一个大学同学,名叫石磊,我在之前的文章里提到过几次,我们俩合作过很多项目.只要有他在,我就特别放心,因为几乎所有难搞的问题,到他这,都能够巧妙地化解.他给我印象最深刻的一句话就是,"有啥 ...
- 如何理解golang中的nil
nil的奇怪行为 刚接触golang时,发现nil在不同的上下文,行为表现是不同的,并且和其他语言中的表现,也不大相同 实例1:输入true, true, false,不符合传递性 func main ...
- ConcurrentHashMap.Segment源码解析
ConcurrentHashMap通过将完整的表分成若干个segment的方式实现锁分离,每个segment都是一个独立的线程安全的Hash表,当需要操作数据时,HashMap通过Key的hash值和 ...
- urllib全解
Urllib库的基本使用 转载1 博客园 python修行路:https://www.cnblogs.com/zhaof/p/6910871.html 转载2csdn 原文链接:h ...
- Spring 基于设值函数(setter方法)的依赖注入
当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了. 下述例子显示了一个类 Text ...
- Hills And Valleys 杭电多校第五场
题意:长度为n的序列,有一次翻转区间的机会,问最长不减序列 题解:如果没有翻转区间的机会,有两个做法. 一是dp[i]表示以i结尾的最长序列 dp[i]=max(dp[i],dp[j]+1) (j& ...
- Class basic syntax
Class basic syntax Wikipedia In object-oriented programming, a class is an extensible program-code-t ...