2014-05-02 03:19
原题:
Given a sequence of numbers A(1) ..A(n), find the continuous subsequenceA(i)..A(j) for which the sum of elements is maximum. condition: we should not select two contiguous numbers
题目:此人的描述简直就是自相矛盾,我的第一念头是这人肯定是个草包,题目都看不懂就从别的地方把题目复制过来了。这题的实际意思,是说允许你从一个长度为n的整数数组中,任意选取若干个元素,使得加起来的和最大,但是选取的任何元素不能存在相邻的情况。
解法:因为不能相邻,所以进行动态规划只需要记录两个状态。空间也只需要O(1)。递推关系为dp[i] = max(dp[i - 1], dp[i - 2], dp[i - 2] + arr[i])。
代码:
1 // http://www.careercup.com/question?id=23594662 2 #include <algorithm> 3 #include <iostream> 4 #include <vector> 5 using namespace std; 6 7 void myswap(int &x, int &y) 8 { 9 if (x == y) { 10 return; 11 } 12 13 x = x ^ y; 14 y = x ^ y; 15 x = x ^ y; 16 } 17 18 int maxDiscontiguousSum(vector<int> &v) 19 { 20 int i, n; 21 int sum1, sum2, sum3; 22 23 n = (int)v.size(); 24 if (n == 0) { 25 return 0; 26 } else if (n == 1) { 27 return v[0]; 28 } 29 30 sum1 = v[0]; 31 for (i = 1; i < n; ++i) { 32 sum1 = v[i] > sum1 ? v[i] : sum1; 33 } 34 if (sum1 <= 0) { 35 return sum1; 36 } 37 38 sum1 = v[0]; 39 sum2 = max(v[0], v[1]); 40 sum3 = sum2; 41 for (i = 2; i < n; ++i) { 42 sum3 = max(sum2, (v[i] > 0 ? sum1 + v[i] : sum1)); 43 sum1 = sum2; 44 sum2 = sum3; 45 } 46 47 return sum3; 48 } 49 50 int main() 51 { 52 vector<int> v; 53 int n; 54 int i; 55 56 while (cin >> n && n > 0) { 57 v.resize(n); 58 for (i = 0; i < n; ++i) { 59 cin >> v[i]; 60 } 61 cout << maxDiscontiguousSum(v) << endl; 62 v.clear(); 63 } 64 65 return 0; 66 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)