user-0 提问: C语言练习题求解

回复:
user: user-1
content: 有点尴尬，之前练习过

user: user-2
content: 再来个逆推的，这个要求必须要有2个及以上的元素才行 unsigned long long test2(int iNum, int* arr1, int* arr2) {   unsigned long long lMax_2[2] = {arr1[iNum-1], arr2[iNum-1]};   unsigned long long lMax_1[2] = {arr1[iNum-2]+lMax_2[1], arr2[iNum-2]+lMax_2[0]};   unsigned long long lMax[2] = {lMax_1[0], lMax_1[1]};   int* arrTem[2] = {arr1, arr2};   for(int i = iNum-3; i >= 0; —i)   {     lMax[0] = arrTem[0][i] + (lMax_1[1] > lMax_2[1] ? lMax_1[1] : lMax_2[1]);     lMax[1] = arrTem[1][i] + (lMax_1[0] > lMax_2[0] ? lMax_1[0] : lMax_2[0]);     memcpy(lMax_2, lMax_1, sizeof(lMax_2));     memcpy(lMax_1, lMax, sizeof(lMax_1));   }   return lMax[0] > lMax[1] ? lMax[0] : lMax[1]; }

user: user-2
content: 引用 20 楼 luj_1768 的回复：19楼代码可能通不过：使用的专有词太多（IMax, size, iLoop）；另外，iLoop的取值需要跟踪一下。stack<vector> sTem 改为 stack<vector<int>> sTem。 .cpp可以编译过

user: user-3
content: 引用 23 楼 weixin_45826375 的回复:再来个逆推的，这个要求必须要有2个及以上的元素才行 有理，那我来个顺推法，元素个数不限  #ifndef MAX #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif  long long ftp_(const int n, const int* a, const int* b) { 	long long fp[3] = { a[0], b[0], 0 }; // a, b, 0 	for (int nn = 1; nn < n; nn++) 	{ 		long t0 = MAX(fp[1] + a[nn], fp[2] + a[nn]); 		long t1 = MAX(fp[0] + b[nn], fp[2] + b[nn]); 		long t2 = MAX(fp[0] + 0, fp[1] + 0); 		fp[0] = t0, fp[1] = t1, fp[2] = t2; 	}  	return MAX(MAX(fp[0], fp[1]), fp[2]); }

user: user-4
content: 19楼代码可能通不过：使用的专有词太多（IMax, size, iLoop）；另外，iLoop的取值需要跟踪一下。

user: user-2
content: 先来个计算所有的然后比较的方法 unsigned long long test1(int iNum, int* arr1, int*   arr2) {   unsigned long long lMax = 0L;   unsigned long long lTem = 0L;   stack<vector> sTem;   sTem.push(vector<int>());   sTem.top().push_back(0);   sTem.top().push_back(1);   int* arrTem[2] = { arr1, arr2 };   stack<unsigned long long> sTemMax;   sTemMax.push(0L);   int iLoop = 0;   while(sTem.size() > 0)   {     if(sTem.top().size() < 1)     {       sTem.pop();       sTemMax.pop();       —iLoop;       lTem = sTemMax.size() > 0 ? sTemMax.top() : 0L;       continue;     }     int iTem = sTem.top().back();     sTem.top().pop_back();     lTem += iTem < 0? 0 : arrTem[iTem][iLoop];     if(++iLoop < iNum)     {       sTem.push(vector<int>());       sTem.top().push_back(iTem < 0? 0 : -1);       sTem.top().push_back(iTem < 1? 1 : 0);       sTemMax.push(lTem);     }     else     {       lMax = lTem > lMax? lTem : lMax;       lTem = sTemMax.top();       iLoop = ((int)sTemMax.size()) - 1;     }   }   return lMax; }

user: user-5
content: 谢谢分享学习中谢谢大家

user: user-2
content: 引用 4 楼 GKatHere 的回复：题目有误，根据输入，8+4是第2天与第3天，不是第2天与第4天。 输入、输出不说了，只说算法： 因为不能两天完成同一BOSS的任务，那么头一天选取了BOSS 1，第二天必选取BOSS 2； 即是：（单数位列表 + 双数位列表 ） 与 （双数位列表 + 单数位列表 ），两者之间取最大值。 以例： 9 3 5 7  5 8 4 1， 取（9 +5） +（ 8 +1） 与 (3 +7)+(5+4)的最大值不一定，你可以第二天什么都不干然后第三天选另一个的啊

user: user-6
content: 引用 14 楼 浅ღ᭄ꦿ夏࿐的回复:想知道1e9什么意思，是1到9吗？ 1en = 10^n

user: user-7
content: 感觉第一个样例最大报酬只有24

user: user-7
content: 想知道1e9什么意思，是1到9吗？

user: user-8
content: 谢谢分享学习中谢谢大家

user: user-9
content: 方便发一下题目链接吗？

user: user-10
content: 路过，这题目，阔以哇

user: user-3
content: 如下：要不a取 0,2,4,6,8,...., b取 1,3,5,7,9....; 要不b取 0,2,4,6,8,...., a取 1,3,5,7,9....;  int a[] = {9, 3, 5, 7 }; int b[] = {5, 8, 4, 1 }; int c = max(a[0] + a[2] + b[1] + b[3], a[1] + a[3] + b[0] + b[2])

user: user-0
content: 引用 4 楼 GKatHere的回复:题目有误，根据输入，8+4是第2天与第3天，不是第2天与第4天。 输入、输出不说了，只说算法： 因为不能两天完成同一BOSS的任务，那么头一天选取了BOSS 1，第二天必选取BOSS 2； 即是：（单数位列表 + 双数位列表 ） 与 （双数位列表 + 单数位列表 ），两者之间取最大值。 以例： 9 3 5 7  5 8 4 1， 取（9 +5） +（ 8 +1） 与 (3 +7)+(5+4)的最大值 你所说的单数位列表和双数位列表是啥，好像没有学过

user: user-11
content: 引用 9 楼 j: )的回复:[quote=引用 7 楼 j: )的回复:]最简单的思路就是设两个数组a、b，两种情况，a取单数下标元素b取双数下标元素，取所有值的和，另一种反过来，对比两种的大小情况就行了 lz没看懂我可以完整写出来[/quote] 好的，这样好像是错的，不一定选取相邻两条就是最大薪酬

user: user-11
content: 引用 7 楼 j: )的回复:最简单的思路就是设两个数组a、b，两种情况，a取单数下标元素b取双数下标元素，取所有值的和，另一种反过来，对比两种的大小情况就行了 lz没看懂我可以完整写出来

user: user-12
content: 不错不错不错不错

user: user-11
content: 最简单的思路就是设两个数组a、b，两种情况，a取单数下标元素b取双数下标元素，取所有值的和，另一种反过来，对比两种的大小情况就行了