Skip to content

Latest commit

 

History

History
59 lines (51 loc) · 1.68 KB

cansplitarray.md

File metadata and controls

59 lines (51 loc) · 1.68 KB

题目描述:

image

解决过程:

第357场周赛t2,ac

一直在想区间dp的解法, 虽然最后是写出来了但是由于对区间dp不是很熟,写了很久,中间还wa了好几发。看了灵神题解,没有想到这竟然是脑筋急转弯的问题

代码:(区间dp→脑筋急转弯)

class Solution {
public:
    int pre[101];
    bool dp[101][101];
    bool canSplitArray(vector<int>& nums, int m) {
        pre[0] = 0;
        int n = nums.size();
        for (int i = 1; i <= n; ++i) {
            pre[i] = pre[i-1] + nums[i-1];
        }
        memset(dp, 0, sizeof dp);
        for (int span = 0; span < n; ++span) {
            for (int i = 0; i < n - span; ++i) {
                int j = i + span;

                if (i == j) dp[i][j] = true;
                else {
                    for (int p = i; p < j; ++p) {
                        if (((i == p || pre[p+1] - pre[i] >= m) && dp[i][p]) && 
                            ((j == p + 1 || pre[j+1] - pre[p+1] >= m) && dp[p+1][j])) {
                            dp[i][j] = true;
                        }
                        if (dp[i][j]) break;
                    }
                }
                // cout << i << ' ' << j << ' ' << dp[i][j] << endl;
            }
        }
        return dp[0][n-1];
    }
};
class Solution {
public:
    bool canSplitArray(vector<int> &nums, int m) {
        int n = nums.size();
        if (n <= 2) return true;
        for (int i = 1; i < n; i++)
            if (nums[i - 1] + nums[i] >= m)
                return true;
        return false;
    }
};