代码实现:
动态规划
/* 从 b 中选一个长为 4 的子序列 定义 dfs(i,j) 表示 从 b[0] 到 b[i] 中选出 j+1 个数,去和 a[0] 到 a[j] 算一个点积的最大值 考虑 b[i] 选或不选 不选 dfs(i-1,j) 选 dfs(i-1,j-1) + a[j] * b[i] dfs(i,j) = max(dfs(i-1),j), dfs(i-1,j-1) + a[j] * b[i] */ #define max(a, b) ((a) > (b) ? (a) : (b)) long long maxScore(int *a, int aSize, int *b, int bSize) { int n = bSize; long long dp[n][4]; for (int i = 0; i < n; i++) { for (int j = 0; j < 4; j++) { dp[i][j] = INT32_MIN; } } dp[0][0] = 1LL * a[0] * b[0]; // j = 0 for (int i = 1; i < n; i++) { dp[i][0] = max(1LL * b[i] * a[0], dp[i - 1][0]); } for (int i = 1; i < n; i++) { for (int j = 1; j < 4; j++) { if (i >= j) { dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + 1LL * a[j] * b[i]); } } } return dp[n - 1][3]; }