活动选择问题——动态规划解法(自底向上)

来源:互联网 发布:淘宝的芦荟胶是真的吗 编辑:程序博客网 时间:2024/06/14 22:03

java实现:

public class 活动选择问题 {public static void main(String[] args) {// 活动A(0) 和 A(N+1) 为辅助作用,不是真实的活动int s[] = {0,1,3,0,5,3,5,6,8,8,2,12,100};int f[] = {0,4,5,6,7,9,9,10,11,12,14,16,101};bottom_to_up(s, f, s.length-2);}public static void print_Activity(int start, int end, int cut_point[][]) {if(cut_point[start][end] > 0) {int k = cut_point[start][end];print_Activity(start, k, cut_point);System.out.print(k+" ");print_Activity(k, end, cut_point);}}public static void bottom_to_up(int s[], int f[], int n) {//定义c[i][j]为在活动A(i)结束之后,A(j)开始之前进行的活动集合的最优解的大小int c[][] = new int[n+2][n+2];//定义cut_point[i][j]为在活动A(i)结束之后,A(j)开始之前进行的活动集合的最优解//所包含的一个活动int cut_point[][] = new int[n+2][n+2]; for(int i = 0; i <= n; i++) {c[i][i] = 0;c[i][i+1] = 0;}for(int l = 2 ; l <= n+1; l++) {for(int i = 0; i <= n-l+1 ; i++) {int j = i + l ;c[i][j] = 0;if(f[i]<s[j]) {for(int k = i + 1; k < j; k++) {//判断活动A(k)是否在A(i)结束之后开始,在A(j)之前结束if(s[k]<f[i] || f[k] > s[j]) {continue;}int q = c[i][k] + c[k][j] + 1;if(q > c[i][j]) {c[i][j] = q;cut_point[i][j] = k;}}}}}System.out.println(c[0][n+1]);print_Activity(0, n+1, cut_point);}}


阅读全文
0 0