1 条题解
-
2
这题可以用动态规划来解决:
1、输入数据
2、每次选取数都必须是本次选择的最优解,并且不能相邻,所以只能选第一项是f[i - 2]加上这一项的本身,第二项则是f[i - 1],这两者的最大值就是本次的最优选取方案,由此可推出动态转移方程为f[i] = max(f[i - 2] + a[i], f[i - 1])
3、输出数据
AC Code:
#include <bits/stdc++.h> using namespace std; int n, f[55], a[55]; // 定义n、a数组和动态数组f int main() { ios::sync_with_stdio(false); // 读入加速 cin.tie(0); cout.tie(0); cin >> n; // 输入n for (int i = 1; i <= n; i++) cin >> a[i]; // 输入数字 f[1] = a[1]; // 由于是第一项,只有一个选择方案,所以只能选a[1]; f[2] = max(a[1], a[2]); // 这里有了两个选项,所以这里得选最优的选数方案 for (int i = 3; i <= n; i++) f[i] = max(f[i - 2] + a[i], f[i - 1]); // 动态规划 cout << f[n]; // 由于每次都是最优解,所以最后一次就是整体最优解 return 0; }
本蒟蒻在这弱弱的求个赞
- 1
信息
- ID
- 418
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 3
- 标签
- 递交数
- 27
- 已通过
- 19
- 上传者