**Leetcode 413. Arithmetic Slices

https://leetcode.com/problems/arithmetic-slices/description/


非常好的dp题

最初傻逼了 写的N^2的。。。然后就超内存了

const int SZ = 5000+1;
int dp[SZ][SZ];
bool is[SZ][SZ];
class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        if (A.size() < 3) return 0;
        if (A.size() == 3) return 1;
        memset(dp, 0, sizeof(dp));
        memset(is, 0, sizeof(is));
        int n = A.size();
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (i + 2 > j) {
                    is[i][j] = 0;
                } else {
                    if (i+2 == j) {
                        is[i][j] = ((A[i+1] - A[i]) * (j-i) + A[i] == A[j]);
                    } else {
                        is[i][j] = is[i][j-1] && ( A[i+1] - A[i] == A[j] - A[j-1] );
                    }
                }
            }
        }
        
        for (int i = A.size() - 3; i >= 0; i--) {
            for (int j = i+2; j < A.size(); j++) {
                // int cnt = 0;
                
                if (i + 2 == j && is[i][j]) {
                    dp[i][j] = 1;
                    continue;
                }
                
                if ( is[i][j] ) {
                    dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1];
                    dp[i][j] += 1;
                } else {
                   dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1];
                }
                // printf("dp[%d][%d]=%d\n", i, j, dp[i][j]);

            }
        }
        return dp[0][A.size()-1];
    }
};

看了https://leetcode.com/problems/arithmetic-slices/discuss/90093/3ms-C++-Standard-DP-Solution-with-Very-Detailed-Explanation

dp[i]以i结尾的个数

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        if (A.size() < 3) return 0;
        vector<int> dp(A.size(), 0);
        dp[2] = A[2] - A[1] == A[1] - A[0];
        int ans = dp[2] ;
        for (int i = 3; i < A.size(); i++) {
            if (A[i] - A[i-1] == A[i-1] - A[i-2])
                dp[i] = dp[i-1] + 1;
            ans += dp[i];
        }
        return ans;
    }
};





猜你喜欢

转载自blog.csdn.net/u011026968/article/details/79890380