0
已解决
王子健
初级天翼
初级天翼
4232 伐木 经验值:800
题目描述 Description
在林场中种着一排共n棵杨树。每棵杨树都有一个价值vi。现在木材公司要砍掉其中的一些杨树带回去加工。由于林场要求,不能连续砍掉两棵相邻的杨树。请问这些杨树最多能获得的价值是多少。
输入描述 Input Description
第一行,一个整数n
第二行,n个整数,分别表示砍第i棵杨树能获得的价值。
输出描述 Output Description
最多能获得的价值
样例输入 Sample Input
4 1 2 3 1
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
2≤n≤1000,0≤vi≤999
又炸了又炸了,0分代码,样例过了。代码如下:
#include <iostream>
using namespace std;
int n, a[1010], maxn = -1;
int main() {
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
for(int i=1; i<=n; i++) {
for(int j=i+2; j<=n; j++) {
maxn = max(a[i] + a[j], maxn);
}
}
cout << maxn;
return 0;
}
大佬帮改
王子健在2020-08-29 07:32:02追加了内容
#include <iostream>
using namespace std;
int f[1001], a[1001];
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i];
}
f[1] = a[1];
for(int i=1; i<=n; i++) {
for(int j=i+2; j<=n; j++) {
f[i] = max(f[i-1], max(f[j] + a[i]));
}
}
cout << f[n];
return 0;
}
赵逸凡大佬给的看不懂啊/kk,
@赵逸凡
0
0
赵逸凡
初级启示者
初级启示者
- 定义:f[i]表示砍前i棵树能获得的最大价值
- 状态:f[i]=max(f[i-1],max(f[j]+a[i]))
- 边界:f[1]=a[1]
- 目标:f[n]
话说这么水的动规题直接暴力dp不就行了吗,我的写法还能加以优化,但完全没必要
赵逸凡在2020-08-26 10:25:19追加了内容
@黄子扬 我的写法是从1年前复制过来的,当时我没理解透dp的奥妙,max(f[j]+a[i])中的f[j]是循环枚举的,因此套max,后来发现如果优化后根本没必要枚举f[j],所以说我太菜了
赵逸凡在2020-08-26 10:27:01追加了内容
@王子健 状态转移方程是对的,只不过可以加些优化
0
0
0
董子墨
中级天翼
中级天翼
不一定只能砍2棵树
状态:f[i][1]处理前i棵树,第i棵树必砍,所获得的最大价值
f[i][0]处理前i棵树,第i棵树不砍,所获得的最大价值
其它自己推
0