###思路
当k=1,跟经典的就没什么两样了
当k>2,思考子数组的长度l
当l<2n的时候,那么就是:
dp[i] = max(dp[i-1]+nums[i mod n], nums[i mod n]);
当l>=2n,那么就是多个arr数组连接在一起了,这时候,就是k-2个arr和加上l<2n时候的结果了。
代码
class Solution {
public:
const int MOD = 1000000007;
int kConcatenationMaxSum(vector<int>& arr, int k) {
// 首先分析k=1时,跟经典的没什么区别
using ll = long long;
ll max_ = 0;
ll cur = 0;
for(auto&it:arr){
max_ = max(max_+it, (ll)it);
cur = max(max_, cur);
}
if (k == 1) return cur%MOD;
// 当k>2时
// 如果l<2n;说明就是经典的连续再遍历一次
// 如果l>=2n,那么就是多个arr的和组成之后
// 形成这样的[][][.][.] // 那么.代表的是,子数组结尾所在的位置
// 那[.][.] 就退化成了结果了
// 接着进行二次遍历
ll sums = 0;
for(auto&it:arr){
sums+=it;
max_ = max(max_+it, ll(it));
cur = max(max_, cur);
}
return (((ll)k-2)*max(sums, (ll)0)+cur)%MOD;
}
};