cf339-C

質問の意味:左側に置く体重を残し、周りの程度のためにバランスの両側に重みを置いた後、右に、右より重い必要がある右の場所の重みは左より重い必要後、体重の一部の種類の数が表示されるようにどれでも、解決策を求めて置きました。
方法:[I] [j]は[DPようDPは、 k]はk番目の場所の重量を示し、Iは、反対重いJよりも、彼はあってもよい
DP [T] [IJ] [ K-1] に移しました私は重い電流Jを置くこと、そして重いIJ上の一定の割合は、tは列挙することができます。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdlib>
    #include<climits>
    #include<stack>
    #include<vector>
    #include<queue>
    #include<set>
    #include<map>
    //#include<regex>
    #include<cstdio>
    #define up(i,a,b)  for(int i=a;i<b;i++)
    #define dw(i,a,b)  for(int i=a;i>b;i--)
    #define upd(i,a,b) for(int i=a;i<=b;i++)
    #define dwd(i,a,b) for(int i=a;i>=b;i--)
    //#define local
    typedef long long ll;
    const double esp = 1e-6;
    const double pi = acos(-1.0);
    const int INF = 0x3f3f3f3f;
    const int inf = 1e9;
    using namespace std;
    int read()
    {
        char ch = getchar(); int x = 0, f = 1;
        while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
        while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
        return x * f;
    }
    typedef pair<int, int> pir;
    #define lson l,mid,root<<1
    #define rson mid+1,r,root<<1|1
    #define lrt root<<1
    #define rrt root<<1|1
    int dp[20][20][1005];//fang k duo j di i
    char s[200];
    int cnt[200];
    int m;
    vector<int >vec;
    void findpath(int nowwei,int dis,int dep)
    {
        if (dep == 0)return;
        vec.push_back(nowwei);
        upd(i, 1, 10)
        {
            if (dp[i][nowwei - dis][dep - 1]&&i!=nowwei) {
                findpath(i, nowwei - dis, dep - 1); return;
            }
        }
    }
    int main()
    {
        cin >> s;
        m = read();
        up(i, 0, 10)if (s[i] == '1')cnt[i + 1] = 1;
        upd(i, 1, 10)if(cnt[i])dp[i][i][1] = 1;
        upd(i, 2, m)
        {
            upd(j, 1, 10)
            {
                upd(k, 1, 10)
                {
                    if (!cnt[k])continue;
                    if (k <= j)continue;
                    upd(p, 1, 10)
                    {
                        if(cnt[p]&&p!=k)
                            dp[k][j][i] |= dp[p][k - j][i-1];
                    }
                }
            }
        }
        upd(j, 1, 10)upd(k, 1, 10)if (dp[j][k][m]) {
            findpath(j, k, m); goto ed;
        }
    ed: if (vec.size() == 0) { cout << "NO" << endl; return 0; }
        cout << "YES" << endl;
        reverse(vec.begin(), vec.end());
        for (auto k : vec)cout << k << " ";
        return 0;
    }

かなりカット枝は非常にマナを感じていても、オンラインのDFS暴力の複雑さを理解していなかった真実を伝えるために。

おすすめ

転載: www.cnblogs.com/LORDXX/p/11591919.html
おすすめ