銆愮粡鍏搞€戝甫闅滅鐨勯摵鐮栧潡鈥斺€擫EETCODE 瑕嗙洊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了銆愮粡鍏搞€戝甫闅滅鐨勯摵鐮栧潡鈥斺€擫EETCODE 瑕嗙洊相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/amp' title='amp'>amp   etc   leetcode   res   鐘跺帇   琛ㄧず   domino   

寰堢粡鍏哥殑棰橈紝浣嗘槸濂戒箙娌″仛杩欑被鏈夌偣蹇樹簡銆傘€?/p>

缁忓吀鐘跺帇dp鍋氭硶锛氱敤S琛ㄧず涓€琛岀殑鐘舵€侊紝鏌愪綅涓?琛ㄧず璇ヤ綅琚崰鐢紝鍙嶄箣琛ㄧず璇ヤ綅鏈鍗犵敤

dp[i][S]琛ㄧず绗琲琛岀姸鎬佷负S鏃剁殑鏈€澶ц鐩栨暟锛岄偅涔堟灇涓剧i-1琛岀殑鐘舵€丼鈥?濡傛灉S,S鈥橀兘鍚堟硶锛岄偅涔堟鏃跺彲浠ユ眰鍑篠鐘舵€佷笅鏈€澶氬彲浠ユ斁澶氬皯鍧楃爾

棰勫鐞嗗嚭cnt[S1][S2]琛ㄧず涓婁竴琛屾槸S1锛屼笅涓€琛屾槸S2鎯呭喌涓嬶紝S2涓婄殑鏈€澶у~鏀炬暟锛屽~鏀剧瓥鐣ワ細鍏堟斁绔栫殑鍐嶆斁妯殑

鐒跺悗dp鏃跺浜庝袱涓姸鎬佸氨鍙互o(1)杞Щ浜?/p>

浜屽垎鍥惧仛娉曪細杩涜榛戠櫧鏌撹壊锛屾瘡涓湴鏉挎娊璞℃垚涓€涓偣锛岄粦鐧芥牸鍒嗘垚涓ら儴鍒?/p>

鏄剧劧鍙互鍦ㄧ浉閭讳袱涓湴鏉夸箣闂磋繛杈癸紝濡傛灉鏄殰纰嶇墿灏变笉鑳借繛锛屽寛鐗欏埄绠楁硶鎵句笅鏈€澶у尮閰嶅嵆鍙?/p>

class Solution {
public:
   
    int cnt[1<<8][1<<8];
    int mp[100][100],block[100];
    void prework(int m){
        for(int S1=0;S1<(1<<m);S1++)
        for(int S2=0;S2<(1<<m);S2++){//涓婁笅鐘舵€佷负S1 S2鏃朵笅鏀炬渶澶氬~鏀炬暟閲?
            int num=0,T=S2;
            for(int i=0;i<m;i++)//鎶婄珫鐨勫~浜?
                if(!(S1>>i & 1) && (T>>i & 1))num++,T-=(1<<i); 
            for(int i=0;i<m-1;i++)
                if((T>>i&1) && (T>>(i+1)&1)){
                    num++;
                    i++;
                } 
            cnt[S1][S2]=num;
        }
    }
    
    int dp[50][1<<8];
    int domino(int n, int m, vector<vector<int>>& broken) {
        prework(m);
        for(auto v:broken)mp[v[0]][v[1]]=1;
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(mp[i][j])block[i]|=(1<<j);
            
        memset(dp,-1,sizeof dp);    
        
        for(int i=0;i<n;i++){
            for(int S=0;S<(1<<m);S++){
                int f=0;
                for(int j=0;j<m;j++)
                    if(!(S>>j & 1) && mp[i][j])f=1;
                if(f)continue;
                
                int T=S-block[i];//鐘舵€丼鍙互鑷敱濉斁鐨勬牸瀛?/span>
                if(i==0)
                    dp[i][S]=max(dp[i][S],cnt[(1<<m)-1][T]);    
                else {
                    for(int S2=0;S2<(1<<m);S2++)
                        if(dp[i-1][S2]!=-1)
                            dp[i][S]=max(dp[i][S],dp[i-1][S2]+cnt[S2][T]); 
                }
            }
        }
        
        int res=0;
        for(int i=0;i<(1<<m);i++)
            res=max(res,dp[n-1][i]);
        return res;
    }
};

 

以上是关于銆愮粡鍏搞€戝甫闅滅鐨勯摵鐮栧潡鈥斺€擫EETCODE 瑕嗙洊的主要内容,如果未能解决你的问题,请参考以下文章

鎴戜滑绗竴娆″彂鐨凪arvin绯诲垪鑵曡〃

馃敘銆愮▼搴忎腑鐨勬暟瀛︺€戝埄鐢ㄥ痉鎽╂牴瀹氬緥绠€鍖栧竷灏旇繍绠?/a>

銆愰潰璇曠瘒銆慔TML銆丆SS闈㈣瘯鐭ヨ瘑鐐归泦閿︼紝涓€鏂囧氨澶熶簡

銆屾煡缂鸿ˉ婕忋€嶅珐鍥轰綘鐨凥TTP鐭ヨ瘑浣撶郴

銆愮綉鐩樿祫婧愩€戦鍝ySQL鍏ㄩ泦

銆愮1203鏈熴€憌ebpack 4 鍙戝竷浜嗭紒