您的位置:首页 > 其它

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

2017-09-10 14:26 197 查看
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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: