銆愮粡鍏搞€戝甫闅滅鐨勯摵鐮栧潡鈥斺€擫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 瑕嗙洊的主要内容,如果未能解决你的问题,请参考以下文章
馃敘銆愮▼搴忎腑鐨勬暟瀛︺€戝埄鐢ㄥ痉鎽╂牴瀹氬緥绠€鍖栧竷灏旇繍绠?/a>