1、临时工问题
非递归式 :
#include<iostream>
using namespace std;
struct stu{
int vi;
int l;
int r;
}a[9] = {{0, 0, 0}, {5, 1, 4}, {1, 3, 5}, {8, 0, 6}, {4, 4, 7}, {6, 3, 8},{3, 5, 9} , {2, 6, 10},{4, 8, 11}};
int prev[9], opt[9];
int dp_opt(){
for(int i = 1; i < 9; i++){
for(int j = i - 1; j >= 0; j--){
if(a[i].l >= a[j].r){
prev[i] = j;
break;
}
}
}
opt[1] = a[1].vi ;
opt[2] = max(a[2].vi + opt[prev[2]], opt[1]);
for(int i = 3; i < 9; i++){
opt[i] = max(opt[i-1], a[i].vi + opt[prev[i]]);
}
return opt[8]; // 因为每一个opt[i] 都是在前i项里面选出的最大值
}
int main(){
cout << dp_opt();
return 0;
}
递归式 :
#include<iostream>
using namespace std;
struct stu{
int vi;
int l;
int r;
};
stu a[9] = {{0, 0, 0}, {5, 1, 4}, {1, 3, 5}, {8, 0, 6}, {4, 4, 7}, {6, 3, 8},{3, 5, 9} , {2, 6, 10},{4, 8, 11}};
int rec_opt(int prev[], int n){
if(n == 0) return 0;
else if(n == 1) return a[1].vi;
else if(n == 2) return max(a[1].vi, a[2].vi);
else{
int A, B;
A = rec_opt(prev, prev[n]) + a[n].vi;
B = rec_opt(prev, n - 1);
return max(A, B);
}
}
int prev[9];
int main(){
for(int i = 1; i < 9; i++){
for(int j = i - 1; j >= 0; j--){
if(a[i].l >= a[j].r){
prev[i] = j;
break;
}
}
}
int n = 8;
cout << rec_opt(prev, n);
return 0;
}