这里主要是在听课时做的笔记 课堂链接 https://www.bilibili.com/video/av18512769
第一题: 在一个数组arr中,找出一组不相邻的数字,使得最后的和最大。
//1. 在一个数组arr中,找出一组不相邻的数字,使得最后的和最大。
//关键在于选于不选
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 32
int a[N],dp[N];
int max(int a, int b) {
return a > b ? a : b;
}
int recOpt(int n) //递归
{
if (n == 0)
return a[0];
if (n == 1)
return max(a[0], a[1]);
else
{
int A = recOpt(n - 2) + a[n]; //选
int B = recOpt(n - 1); //不选
return max(A, B);
}
}
int dpOpt(int n) //动态规划
{
dp[1] = max(a[0], a[1]);
dp[0] = a[0];
for (int i = 2; i < n; i++)
{
dp[i] = max(dp[i - 2] + a[i], dp[i - 1]);
}
return dp[n - 1];
}
int main(void)
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
printf("%d
", recOpt(n - 1));
printf("%d
", dpOpt(n));
}
system("pause");
return 0;
}
/*
7
1 2 4 1 7 8 3
5
4 1 1 9 1
结果 15 13
*/