这里主要是在听课时做的笔记 课堂链接 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 */