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; } };