C - Digital Path 計蒜客 - 42397(dp記憶化搜尋)
題目:vj地址
思路:dp[i][j][k]代表 以i,j結尾 有k長度的路徑數量,k最大等於4,如果k超過4,也是等於4.
那麼轉移:dp[i][j][k]+={dp[x][y][k-1]}(x,y滿足a[x][y]+1=a[i][j]);
如果k=4,還有dp[i][j][k]+={dp[x][y][k]}(x,y滿足a[x][y]+1=a[i][j]);
細節見程式碼。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int > pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=1e9+7;
const ll N =2e6+10;
const double eps = 1e-4;
const double pi=acos(-1);
ll gcd(int a,int b){return !b?a:gcd(b,a%b);}
ll dp[1100][1100][5];
ll a[1100][1100];
ll n,m;
bool check1(ll x,ll y)//檢查是否能轉移
{
for(ll i=0;i<4;i++)
{
ll x1=x+dx[i],y1=y+dy[i];
if(x1<=0||x1>n||y1<=0||y1>m) continue;
if(a[x][y]-1==a[x1][y1]) return 0;
}
return 1;
}
bool check2(ll x,ll y)
{
for(ll i=0;i<4;i++)
{
ll x1=x+dx[i],y1=y+dy[i];
if(x1<=0||x1>n||y1<=0||y1>m) continue;
if(a[x][y]+1==a[x1][y1]) return 0;
}
return 1;
}
ll dfs(ll i,ll j,ll k)//記憶化搜尋
{
if(k==1)
{
if(check1(i,j)) return 1;
else return 0;
}
if(dp[i][j][k]!=-1) return dp[i][j][k];
ll &ans=dp[i][j][k];
ans=0;
for(ll w=0;w<4;w++)
{
ll x1=i+dx[w],y1=j+dy[w];
if(x1<=0||x1>n||y1<=0||y1>m) continue;
if(a[x1][y1]+1==a[i][j])
{
ans+=dfs(x1,y1,k-1);
if(k==4) ans=(ans+dfs(x1,y1,4))%mod;//k==4時的特判轉移條件
}
}
return ans;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
memset(dp,-1,sizeof dp);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]);
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(check2(i,j)) ans=(ans+dfs(i,j,4))%mod;//滿足轉移條件時才能加
}
}
cout<<ans<<endl;
return 0;
}
相關文章
- C++記憶化搜尋C++
- 記憶化搜尋
- Codeforces 148D Bag of mice:概率dp 記憶化搜尋
- 一類適合記憶化搜尋的區間dp
- poj1179 區間dp(記憶化搜尋寫法)有巨坑!
- codeforces 505C. Mr. Kitayuta, the Treasure Hunter (記憶化搜尋)
- Codeforces 900D Unusual Sequences:記憶化搜尋
- 組合數的計算(利用楊輝三角/記憶化搜尋)
- 【記憶優化搜尋/dp】HDU - 6415 - 杭電多校第九場 - Rikka with Nash Equilibrium優化UI
- POJ 1579-Function Run Fun(記憶化搜尋-遞迴)Function遞迴
- 【leetcode 1510 石子游戲】【記憶化搜尋】LeetCode
- 計蒜客:最甜的蘋果(線段樹)蘋果
- 計蒜客:騎車比賽(Dijkstra)
- Codeforces Round #390 (Div. 2)(A,B,C(記憶化搜尋),D(貪心,優先佇列))佇列
- 計蒜客:農場看守(DFS、尤拉回路)
- ES 筆記十七:結構化搜尋筆記
- WeetCode3 暴力遞迴->記憶化搜尋->動態規劃遞迴動態規劃
- 網頁搜尋客戶端網頁客戶端
- 計蒜客 移除陣列中的重複元素陣列
- 計蒜客模擬賽D2T1 蒜頭君的兔子:矩陣快速冪矩陣
- 二叉搜尋樹 [四邊形不等式優化區間dp]優化
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- POJ 2311-Cutting Game(Nim博弈-sg函式/記憶化搜尋)GAM函式
- 【leetcode 3149. 找出分數最低的排列】記憶化搜尋LeetCode
- IP搜尋客 1.61 註冊碼計算 (2千字)
- c++ 廣度優先搜尋(寬搜)C++
- 搜尋引擎優化(SEO)優化
- NOIP2014pj子矩陣[搜尋|DP]矩陣
- 程式碼填空:組合數字 計蒜客 - A1145
- 搜尋外貿客戶軟體推薦
- 計蒜客模擬賽D1T1 蒜頭君打地鼠:矩陣旋轉+二維字首和矩陣
- 泛型模板化設計使用-訂單搜尋介面泛型
- solr搜尋分詞優化Solr分詞優化
- 微信全文搜尋優化之路優化
- 搜尋結果頁優化優化
- Google的個性化搜尋Go
- BZOJ 1048: [HAOI2007]分割矩陣 記憶化搜尋,二維字首和矩陣
- 折半搜尋學習筆記筆記