#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int rec_opt(int arr[], int i) { //递归方法,效率较低
if (i == 0) return arr[0];
else if (i == 1) return max(arr[0], arr[1]);
else
{
int a = rec_opt(arr, i - 2) + arr[i];
int b = rec_opt(arr, i - 1);
return max(a, b);
}
}
int dp_opt(int arr[], int arrSize) { //非递归方法,利用数组避免计算重复子问题
int opt[7];
opt[0] = arr[0];
opt[1] = max(arr[0], arr[1]);
for (int i = 2; i < arrSize; i++) {
int a = rec_opt(arr, i - 2) + arr[i];
int b = rec_opt(arr, i - 1);
opt[i] = max(a, b);
}
return opt[arrSize - 1];
}
int main() {
int arr[] = { 1,2,4,1,7,8,3 }; 数组样例
printf("%d",rec_opt(arr, 6));
printf("%d", dp_opt(arr, 7));
return 0;
}
答案是:15