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;
}
相關文章
- HDU 6415(dp/記憶化搜尋)
- C++記憶化搜尋C++
- 記憶化搜尋
- 一類適合記憶化搜尋的區間dp
- 【記憶優化搜尋/dp】HDU - 6415 - 杭電多校第九場 - Rikka with Nash Equilibrium優化UI
- 【leetcode 1510 石子游戲】【記憶化搜尋】LeetCode
- 記憶搜尋解救滑雪問題
- 組合數的計算(利用楊輝三角/記憶化搜尋)
- 【leetcode 3149. 找出分數最低的排列】記憶化搜尋LeetCode
- 計蒜客:騎車比賽(Dijkstra)
- WeetCode3 暴力遞迴->記憶化搜尋->動態規劃遞迴動態規劃
- ES 筆記十七:結構化搜尋筆記
- I - Max answer 計蒜客 - 38228 單調棧
- 計蒜客:最甜的蘋果(線段樹)蘋果
- 計蒜客:農場看守(DFS、尤拉回路)
- 計蒜客 - T1342 - 雞兔同籠
- 【計蒜客】2017藍橋杯模擬賽(四)
- 計蒜客 煩惱的高考志願題解
- 計蒜客 移除陣列中的重複元素陣列
- 計蒜客 - T1151 - 奇數單增序列
- 二叉搜尋樹 [四邊形不等式優化區間dp]優化
- 程式碼填空:組合數字 計蒜客 - A1145
- c++ 廣度優先搜尋(寬搜)C++
- 【Leetcode】1340. Jump Game V 【動態規劃/記憶性搜尋】LeetCodeGAM動態規劃
- Codeforces Round #689 (Div. 2, based on Zed Code Competition)-B. Find the Spruce(DFS+記憶化搜尋)Zed
- 【藍橋杯】計蒜客2017模擬賽A習題整理
- 搜尋引擎優化(SEO)優化
- 泛型模板化設計使用-訂單搜尋介面泛型
- 折半搜尋學習筆記筆記
- 搜尋外貿客戶軟體推薦
- solr搜尋分詞優化Solr分詞優化
- Android本地搜尋最佳化Android
- B - 結果填空:炮臺實驗 計蒜客 - A2222(沒理解)
- dp 套 dp(dp of dp)小記
- BM搜尋演算法C實現演算法
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- 搜尋元件最佳化 - Command ⌘K元件
- 海量資料搜尋---搜尋引擎