题目描述
肥成家有nn盆花排成一排,每盆花底藏有一个包含ViVi喵币的红包,肥成可以选择一些花带回自己的小卧室(同时也会拿走这盆花底藏的红包)。Keeper Chen规定相邻的两盆花不能同时选,肥成早就打听到每盆花底藏的红包是多少了,请你写一个程序帮肥成选择一些花,使得肥成最终可得到的喵币价值最大。
输入格式
第一行一个整数nn,代表有nn盆花。
第二行nn个整数ViVi,两两之间以空格间隔,代表藏在每盆花底的红包的喵币价值。
数据范围
对于100%100%的数据有,1≤n≤10001≤n≤1000
数据保证Vi≥1Vi≥1 ,保证运算结果都在intint范围内
输出格式
输出一行一个整数,表示肥成可以得到的最大价值。
样例解释
样例输入
5 3 1 2 5 1
样例输出
8
样例输入
4 4 1 1 4
样例输出
8
样例输入
7 10 20 30 40 10 2 3
样例输出
63
此题看似复杂,但由于算法通过线性遍历,只需要将便利的范围减去1,即可达到前后相邻的花盆不选的效果
代码实现:
#include <iostream>
#include <cstdlib>
int main() {
register unsigned short n, * list, temp, * result;
//声明变量
std::cin >> n;
list = new unsigned short[n];
result = new unsigned short[n];
//线性表数组声明并分配内存
for (register unsigned short i = 0; i < n; i++) {
result[i] = 0;
}
//初始化数组
for (register unsigned short i = 0; i < n; i++) {
std::cin >> list[i];
}
//输入数据
result[0] = list[0];
for (register unsigned short i = 1; i < n; i++) {
temp = 0;
for (register unsigned short j = 0; j < i - 1; j++) {
if (result[j] > temp)
temp = result[j];
}
result[i] = temp + list[i];
}
//DP主要部分
temp = 0;
for (register unsigned short i = 0; i < n; i++) {
if (result[i] > temp) {
temp = result[i];
}
}
std::cout << temp;
//寻找输出最优子结构
return 0;
}
测评结果: