正月点灯笼 ——动态规划

这里主要是在听课时做的笔记  课堂链接  https://www.bilibili.com/video/av18512769

第一题:

//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\n", recOpt(n - 1));
		printf("%d\n", dpOpt(n));
	}
	system("pause");
	return 0;
}
/*
  7
  1 2 4 1 7 8 3
  5
  4 1 1 9 1

  结果 15 13 
*/

  

猜你喜欢

转载自www.cnblogs.com/asdfknjhu/p/12346389.html