初始化 dp[0][x] = dp[0][x] = 1 (x为num[0])
转移方程为dp[n][m] = dp[n - 1][m + num[n - 1]] + dp[n - 1][m - num[n - 1]] (n为1~nums.size() - 1, m为-1000~1000)
可以使用滚动数组优化空间。
class Solution {
public:
void exchage(int num, int count, int &a, int &b) {
if (num >= 0)
a += count;
else
b += count;
}
int findTargetSumWays(vector<int>& nums, int target) {
int dp1[21][1001] = {0};
int dp2[21][1001] = {0};
dp1[0][nums[0]] = 1;
dp2[0][nums[0]] = 1;
for (int i = 1; i < nums.size(); i++) {
auto &index = nums[i];
for (int j = 0; j <= 1000; j++) {
if (dp1[i - 1][j] > 0) {
int num1 = j + index;
int num2 = j - index;
exchage(num1, dp1[i - 1][j], dp1[i][abs(num1)], dp2[i][abs(num1)]);
exchage(num2, dp1[i - 1][j], dp1[i][abs(num2)], dp2[i][abs(num2)]);
}
if (dp2[i - 1][j] > 0) {
int num1 = -j + index;
int num2 = -j - index;
exchage(num1, dp2[i - 1][j], dp1[i][abs(num1)], dp2[i][abs(num1)]);
exchage(num2, dp2[i - 1][j], dp1[i][abs(num2)], dp2[i][abs(num2)]);
}
}
}
return target >= 0 ? dp1[nums.size() - 1][target] : dp2[nums.size() - 1][abs(target)];
}
};