• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            漲18rating.....

            250pt

            一個只含有大寫字母的長度為N的字符串,問交換相鄰字母X次后,最長的連續(xù)字母是多長。(N<50,X<2,500)

            算法分析:

            枚舉,枚舉再枚舉。 枚舉字母的“集結(jié)點”,然后模擬。O(N*N*X)。 尼瑪我居然枚舉的聯(lián)通塊什么水平。。。。。還交了兩次98pt...

            #include<string>
            #include<cstdlib>
            #include<iostream>
            using namespace std;
            int vis[100];
            inline bool dis(int l,int r,int pos,int &mx){
                int v = min(abs(pos-l),abs(pos-r))-1;
                if(v < mx) {mx = v; return 1;}
                return 0;
            }
            const int inf = ~0u>>2;
            class ColorfulChocolates{
                public : int maximumSpread(string ch, int ms){
                    int n = ch.size(), ans = 0;
                    for(int i=0;i<26;i++){
                        char x = 'A'+i;
                        bool flag = 0;
                        int l,r, v = 0;
                        for(int i=0;i<n;i++) {
                            if(ch[i]==x) {
                                if(!flag) l = i, flag = 1;
                            }
                            //cout<<"i: "<<i<<" "<<l<<endl;
                            int value =0;
                            // block
                            if(flag && (i == n-1 || ch[i+1]!=x)){
                            //    cout<<"l: "<<l<<" "<<r<<endl;
                                flag = 0; r = i;
                                int tp = ms;
                                for(int i=0;i<n;i++) vis[i] = 0;
                                value = r-l+1;
                                while(1){
                                    int mx = inf,s=-1;
                                    for(int j=0;j<n;j++)
                                        if(j < l || j> r)
                                            if(!vis[j]&&ch[j]==x && dis(l,r,j,mx)) {
                                            //    cout<<j<<" ";
                                                s = j;
                                            }
                                            cout<<endl;
                                    if(s==-1) break;
                                    if(mx > tp) break;
                                    tp -= mx; vis[s] = 1;
                                    if(s > r) r ++; else l--;
                                    value ++;
                        //    cout<<s<<" "<<mx<<" "<<tp<<endl;
                                }
                        //    cout<<l<<" "<<r<<" "<<value<<endl;
                            }
                            if(value > v) v = value;
                        }
                    //    cout<<x<<" "<<v<<endl;
                        if(ans<v) ans = v;
                    }
                    return ans;
                }
            };


            500pt

            一個N<50個點的有向圖,你一開始再結(jié)點1,每次只能走相鄰的且標(biāo)號最小的結(jié)點。問最少切割多少個點,才可能到達(dá)點N-1。

            算法分析:

            這是個從后往前的動態(tài)規(guī)劃,dp[i]代表從i到n-1最少切割的點數(shù)。它可以從它能到達(dá)的點推導(dǎo)而來。
            最優(yōu)解沒有環(huán),且轉(zhuǎn)移順序不明確。典型的spfa可搞。

            #include<iostream>
            #include<string>
            #include<vector>
            using namespace std;
            const int N = 55;
            int dp[N], vis[N], Q[N*N*N];
            const int inf = ~0u>>2;
            bool relax(int c,int &d){
                if(c<d){d = c; return 1;}
                return 0;
            }
            class ColorfulWolves{
            public :int getmin(vector<string> G){
                int n = G.size();
                for(int i=0;i<n;i++) dp[i] = inf;
                Q[0] = n-1;
                dp[n-1] = 0;
                int head= 0,tail = 1;
                while(head<tail){
                    int u = Q[head++]; vis[u] = 0;
                    for(int v = 0; v< n; v++) if(G[v][u] == 'Y'){
                        int cnt =0;
                        for(int i=0;i<u;i++) cnt += G[v][i] =='Y';
                        if(relax(cnt+dp[u],dp[v]) && !vis[v]){
                            vis[v] = 1;
                            Q[tail++] = v;
                        }
                    }
                }
                return dp[0] == inf? -1: dp[0];
            }};
            posted on 2012-08-05 09:50 西月弦 閱讀(518) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告比賽感言
            2021久久国自产拍精品| 亚洲精品无码久久千人斩| 性色欲网站人妻丰满中文久久不卡| 久久久久久极精品久久久| 亚洲国产成人久久综合碰碰动漫3d | 国产成人久久精品麻豆一区| 久久r热这里有精品视频| 色综合久久久久| 麻豆精品久久精品色综合| 国产精品久久一区二区三区| 久久美女网站免费| 精品免费久久久久国产一区| 香蕉久久永久视频| 一本久久a久久精品亚洲| 国产精品久久久久a影院| 亚洲精品蜜桃久久久久久| 精品国产乱码久久久久久1区2区| 国产精品久久精品| 久久无码一区二区三区少妇 | 性做久久久久久久久久久| 亚洲欧美久久久久9999| 色欲久久久天天天综合网精品| 国内精品久久人妻互换| 久久99精品久久久久久水蜜桃| 亚洲精品tv久久久久| 国内精品人妻无码久久久影院 | 老男人久久青草av高清| 久久综合给合久久狠狠狠97色| 色综合合久久天天综合绕视看| 伊人久久大香线蕉综合5g| 久久精品亚洲一区二区三区浴池 | 亚洲欧美日韩久久精品第一区| 国产精品美女久久久| 婷婷国产天堂久久综合五月| 久久精品国产亚洲av影院 | 精产国品久久一二三产区区别 | 久久这里都是精品| 久久久久人妻一区二区三区vr| 久久九九久精品国产免费直播| 国产成人精品免费久久久久| 无码任你躁久久久久久老妇App|