文章

10

粉丝

66

获赞

3

访问

45.3k

头像
题解:动态规划 - 状态压缩
P895 上海交通大学2021年机试题
发布于2022年5月22日 12:00
阅读数 4.1k

复杂度分析

  • 时间复杂度: O(N*2^N),其中 N 是 A 的长度。

  • 空间复杂度: O(N*2^N)。

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    static const int N = 12 + 1;
    std::unordered_set<int> st;
    int dp[N][1 << N];

    int dfs(int v, int state, const vector<int> &A) {
        // 递归的边界
        if ((1 << v) == state) return 1;
        // 记忆化
        if (dp[v][state] != -1) return dp[v][state];

        int ret = 0, n = A.size();
        std::unordered_set<int> used;    
        for (int u = 0; u < n; ++u) {
            if (((1 << u) & state) && u != v && st.find(A[u] + A[v]) != st.end() && used.find(A[u]) == used.end()) {
                used.insert(A[u]);
                ret += dfs(u, state - (1 << v), A);
            }
        }
        return dp[v][state] = ret;
    }
    int numSquarefulPerms(vector<int>& A) {
        ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发