活动选择问题——动态规划解法(自底向上)
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);
}
}
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);
}
}
相关文章推荐
- 算法导论 动态规划 钢条分割问题的自底向上解法
- 算法导论--贪心算法与动态规划(活动选择问题)
- 动态规划——活动选择问题
- [置顶] 活动选择问题(1)-动态规划分析
- 活动选择问题 (动态规划、贪心算法)
- 【算法导论】用动态规划解活动选择问题
- 动态规划——贪心算法——活动选择问题
- 活动选择问题的动归和贪心解法
- 算法导论 动态规划 钢条切割问题的自底向上解法
- 动态规划 - 活动选择问题
- [贪心]活动选择问题 Activity Selection的思想
- 贪心算法_活动选择问题
- SDUT 2073----活动选择问题
- 整数拆分问题 动态规划解法
- 活动选择问题
- 贪心法——活动选择问题和背包问题
- 算法导论-16.1-4 活动教室选择问题
- 活动选择问题
- 钢铁切割问题 动态规划(输出切割方案和带成本的解法)
- 活动选择问题