題意:中文
思路:定義dp【i】為第i列埋的地雷數,num[i]為第i個格仔上面標著的數字。所以有dp[i]=num[i-1]-dp[i-2]-dp[i-1](當有三個連續的列時) dp[i]=num[i-1]-dp[i-1],當此時為第一列。
定義好了以後,還有乙個關鍵的地方在於:如果一列的地雷數為0或2,則這一列只有一種方法,如果有乙個地雷則有兩種放法。
#include#include#include#includeusing namespace std;
const int maxn=1e4+50;
const long long mod=1e8+7;
int t,dp[maxn],n;
long long ans;
char s[maxn];
void solve()
if(j
#include#include#include#includeusing namespace std;
const int maxn=1e4+50;
int t,length,d[maxn],cnt,dirx=,diry=,tmp;
char s[maxn];
bool vis[3][maxn];
void dfs(int num,int cur2)
int tot=0;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
if(vis[1+diry[i]][cur2+1+dirx[j]]) tot++;
int temp=s[cur2+1]-'0';
if(temp-tot<0) return;
dfs(temp-tot,cur2+1);
} else
} return 0;
}
HDU 5969 最大的位或
開始這道題一直想著直接位運算去遍歷,排除情況,但資料量還是很大,後來把兩個數二進位制所有位都分別放在兩個bool型陣列裡,就簡單多了,只需要考慮輸入的那兩個數從哪一位開始出現不同,小數也就是下界,其到上界之內一定會出現與下界位數相等並所有位數全1的數,所以以上界數為基礎,存在乙個數使它一段字尾或運算...
HDU 5969 最大的位或
首先感謝這位前輩的部落格 這裡詳細說下自己的理解。這題主要是思路 輸入兩個整數l和r,求兩個數滿足l x y r,使得x y最大。另ans x y,那麼ans肯定的位數肯定和r一樣,因為位數越多,這個數就越大,位數最多的肯定是r。所以我們先把r用二進位制表示,把每一位存在乙個陣列裡面。然後從二進位制...
HDU5969 最大的異或
求l和r之間的數能得到的最大異或值 先把l r轉化為2進製儲存下來再從最高位往後遍歷一遍,如果某一位相同且是0說明這個位不管怎麼樣都不能取到1的數。而如果是1則能取,則讓sum加上,執行到第乙個不同的位置就可以跳出啦,因為以下的每一位都是可以取到的,加完break即可 wa還是因為longlong。...