hdu5969 動態規劃(遞推)

2021-08-17 02:17:13 字數 924 閱讀 5889

題意:中文

思路:定義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。...