动规作业-求数组不相邻元素之和的最大值
描述 | |
给定一个长度为n的数组,从其中任意选择不相邻的m个元素形成子数组,求这个子数组所有元素之和的最大值。 | |
关于输入 | |
输入包括两行。 第一行为一个正整数n(0<=n<=10000)。 第二行为n个正整数,表示整个数组。 |
|
关于输出 | |
输出一个数字,代表数组所有不相邻元素之和的最大值。 | |
例子输入 | |
5
|
|
例子输出 | |
9
|
代码:
1 //求数组不相邻元素之和的最大值 2 //2019-11-26 3 #include<iostream> 4 using namespace std; 5 int a[10010]; 6 int d[10010]; //d[i]表示从前i个数中取不相邻元素之和的最大值 7 int main(){ 8 int n; 9 cin>>n; 10 int i,j; 11 for(i = 1; i <= n; i++) 12 cin>>a[i]; 13 d[1] = a[1]; 14 d[2] = max(a[1],a[2]); 15 for(i = 3; i <= n; i++) 16 d[i] = max(d[i-1],d[i-2]+a[i]); 17 cout<<d[n]; 18 return 0; 19 }
备注:
这道题感觉有点像是一维的背包问题类似?都是考虑从前i个数里取。首先要注意初始化前两个数,因为要用到i-2。还有不同的是,因为不相邻的限制,考虑第i时,如果取第i个数,那么就应该是d[i-2]+a[i],如果不取,就延续d[i-1]