原題鏈結
題目大意:給你n組資料,每組表示3*m的掃雷格仔的最中間一格的情況,現不知道第一行和第三行的情況位置,要求你求出滿足給定序列數字,在第一行和第三行放雷的情況有多少種。
題解:dp+遞推列舉
我們可以知道第一列的情況最多三種:0,1,2表示第一列放雷的個數。然後從第二列往後遞推,dp[i]表示第i列放雷的個數,則
dp[0] = 0如果dp[i]<0 或者dp[i]>2 表示當前第i列放雷的方案錯誤,則列舉失敗。如果遞推過程中dp值一直滿足要求的話,則i最終會到達n,再判斷dp[i] = a[i-1]-dp[i-1]-dp[i-2]
如果 a[n] = dp[n-1]+dp[n]表示最後一列正好滿足的話,則第一列列舉的個數是合法的,對答案有貢獻
記錄乙個中間答案值ret,表示這種列舉的方法可以有多少種放法
然後再從1-n掃一遍,如果dp[i] == 1,則表示可以往上面或者下面放,則當前ret*=2,最後再把ret加入到最終答案中,記得取模
**:
#include
#include
#include
#include
using
namespace std;
const
int mode=
100000007
;const
int maxn=
1e4+10;
typedef
long
long ll;
int n,t;
char s[maxn]
;int a[maxn]
,dp[maxn]
;int
main()
int ans =0;
for(
int i=
0;i<=a[1]
;i++)if
(j<=n)
continue;if
(a[n]
!= dp[n-1]
+ dp[n]
)continue
; ll ret=1;
for(
int j=
1;j<=n;j++
) ans =
(ans % mode + ret)
% mode;
}printf
("%d\n"
,ans);}
return0;
}
HDU 5965 掃雷 線性遞推
給乙個3 n的矩陣,第一行和第三行可能會有地雷,第二行沒有地雷,第二行每個格仔上都有1個數,表示在以該格仔為中心的九宮格中一共有幾個地雷。給出第二行每個格仔上的數字,問安放地雷的方案。乍一看不會。然後再仔細想想,可以發現第一列的地雷數量決定了第二列的地雷數量,而第一列和第二列的數量決定了第三列的數量...
HDU 5965 掃雷(dp 遞推)
傳送門 掃雷遊戲是晨晨和小璐特別喜歡的智力遊戲,她倆最近沉迷其中無法自拔。該遊戲的介面是乙個矩陣,矩陣中有些格仔中有乙個地雷,其餘格仔中沒有地雷。遊戲中,格仔可能處於己知和未知的狀態。如果乙個己知的格仔中沒有地雷,那麼該 格仔上會寫有乙個一位數,表示與這個格仔八連通相鄰的格仔中地雷總的數量。現在,晨...
HDU5965 掃雷 記憶化搜尋
思路 設d i j k l 為 第i個位置還有j個炸彈未放置,且 1,i 的位置有k個雷,3,i 的位置有l個雷,0 k,l 1時的方案總數,那麼i 1個位置還剩str i 1 0 k l個雷未放置,再按當前剩餘j k l個未放置的類在i 1的位置上放置 include include includ...