數字dp從lv1到lv2

2022-06-17 21:30:14 字數 3006 閱讀 4186

考慮到在記憶化搜尋過程中,大部分數都是zero==0,只有少數數是zero==1,所以我們只對zero==0的情況做記憶化處理

int dp[12][10][2]; // dp[pos][pre][lim]

int dfs(int pos, int pre, bool lim,bool zero)

int res = 0;

int r = lim ? b[pos] : 9;

int l = zero ? 1 : 0;

for (int i = l; i <= r; i++)

if (!zero) return dp[pos][pre][lim] = res;//記憶化

else return res;//不做記憶化處理

}

同樣,lim這一維也是可以刪掉的

int dp[12][10]; // dp[pos][pre]

int dfs(int pos, int pre, bool lim,bool zero)

int res = 0;

int r = lim ? b[pos] : 9;

int l = zero ? 1 : 0;

for (int i = l; i <= r; i++)

if (!zero&&!lim) return dp[pos][pre] = res;//記憶化

else return res;//不做記憶化處理

}

那麼pre這一維呢,思考一下,感覺不行

我試了一下,發現樣例是過了,交一發試試,結果全wa了,看來對於這題來說還是不能刪掉這一維

因為windy數涉及到pos的前一位數對pos這位數的影響,所以dp陣列裡和dfs的引數裡都要有pre

而在有些其他題目裡,比如 不要62,你甚至可以只開一維!! 用一維記憶化搜尋!!

那麼減維有什麼用呢,減維雖然減少了空間,但記憶化的東西少了,就增加了時間,在空間本來就很充足的情況下,減維是不合適的

如果空間不夠,可以考慮減維

有時候,dfs的引數裡也可以刪掉zero這一項,比如題目說前導零的數也是合法的,或者把題目看成是前導零的數也是合法的,並不影響最終的輸出

gym102452j junior mathematician 2019icpc 香港

這題我一開始想出來的是開乙個dp[5000][10][60][60][60][2][2]     (dp[pos][pre][su][f(x)%m][x%m][lim][zero])  的陣列

後來研究了好久題解才知道,這題把lim和zero兩維刪去了,同時這題不用考慮pre,dfs和dp陣列裡都沒pre,同時dfs的引數也可以刪掉zero這一項

根據具體的題意可以把 f(x) % m 和 x % m 合併成 ( f(x) - x ) % m

這樣dp陣列就變成了dp[5000][60][60] (dp[pos][su][mmm]  , mmm = ( f(x) - x ) % m)

#include#include#includeusing namespace std;

const long long mod = 1e9 + 7;

long long dp[5003][61][61];

int pp[5003];

int m;

int b[5003];

int tot = 0;

long long dfs(int pos, int su, int mmm,bool lim)

if (!pos)

int l, r;

l = 0;

r = lim ? b[pos] : 9;

long long res = 0;

for (int j = l; j <= r; j++)

res %= mod;

if (!lim) return dp[pos][su][mmm] = res;

else return res;

}long long qiu(string s,int len)

} }for (int i = 1; i <= len; i++)

for (; !b[len]; len--);

long long res = 0;

return dfs(len, 0, 0, 1);//刪去zero這一引數後,就只需從第len位開始搜

}int main()

else break;

} cout << (qiu(b,lenb) - qiu(a,lena)+mod)%mod << endl;

} return 0;

}

附上這題dfs的引數裡沒刪去zero的**

long long dfs(int pos, int su, int mmm, bool lim, bool zero) 

if (!pos)

int l, r;

l = zero ? 1 : 0;

r = lim ? b[pos] : 9;

long long res = 0;

for (int j = l; j <= r; j++)

res %= mod;

if (!lim && !zero) return dp[pos][su][mmm] = res;

else return res;

}long long qiu(string s, int len)

} }for (int i = 1; i <= len; i++)

for (; !b[len]; len--);

long long res = 0;

res = dfs(len, 0, 0, 1, 1);

for (int i = len - 1; i > 1; i--)

res %= mod;

return res;

}

通訊加密遊戲介面自動化設計Lv1

團隊多款遊戲產品同時上線,每款產品都是使用通訊加密演算法將通訊內容進行加密。後台的乙個修改需要對多款遊戲進行測試。在特定的人力背景下,無法按時完成測試發版任務。思考前後端分離的測試模式。後端lv1階段通過自動化介面來確保後端api介面的正常。lv1 總的設計架構 整體邏輯設計,anyproxy 對通...

必備Linux命令和C語言基礎(lv1 第三課

必備linux命令和c語言基礎 八 資料型別 九 常量 十 變數 十 一 運算子 1day 知識點八 資料型別 1 資料型別的分類 1 基本型別 1 整型 int i int 4個位元組 ii signed int 4個位元組 iii unsigned int 4個位元組 iv short int ...

必備Linux命令和C語言基礎(lv1 第五課

必備linux命令和c語言基礎 二 十 一維陣列 二十一 二維陣列 二十二 字元陣列和字串 二十三 字串處理函式 1day 二 十 一維陣列 1 什麼是陣列 陣列是乙個構造型別 是具有一定順序的若干個變數的集合,組成陣列的各個變數稱位陣列的元素 陣列的元素型別必須相同,可以使用下標進行訪問 2 定義...