數字DP入門總結 不要62 windy數總結

2021-08-19 14:39:16 字數 1340 閱讀 5190

前段時間滾去搞了一波半期 然後學校又組織的五天西安遊學 於是就乙個星期都沒有碰oi.....

終於回來了 學習數字dp  看了一下午 做了兩道題 才感覺摸到一點火門

直接上兩道題解吧

1.不要62

傳送門:

題意不多說 是中文都看得懂

為了方便闡述 我們把不含4,62的數稱為吉利數  反之為非吉利數

這個題是在乙個區間裡找個數 所以我們考慮用字首和的思想 只需找出1~m,1~n各自的個數 再相減就行了 於是這樣只用關心上界了(命為work函式 work(x)可以求出【0,x】區間裡的吉利數個數)

定義一下dp陣列 這道題有什麼明顯的狀態轉移嗎?注意到長度<=i位的吉利數個數 其實就是10個<=i-1位數的吉利數個數之和

(比如三位數即999    999就等於0~99,100~199,...900~999) 但是在這道題裡要丟掉4 以及避免62的出現 這種細節後面再說

因此我們可以預處理出dp陣列 由於後面有用 因此我們定義

dp[i][0]:<=i位的吉利數個數     dp[i][1]:長度為i 最高位是2的個數    dp[i][2]:<=i位的非吉利數個數 

work函式直接看注釋吧 很詳細的 不想多講了

不要灰心 用紙對著乙個數字推演下 會看懂的 我們都看了很久才懂

#includeusing namespace std;

int n,m,dp[15][3],a[12];

//dp[i][0]:<=i位的吉利數個數

//dp[i][1]:長度為i 最高位是2的個數

//dp[i][2]:<=i位的非吉利數個數

void init()

}int work(int x) //求0< <=x區間裡的吉利數

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

else

}if(flag) ans++;

return rec-ans;

}int main()

} }//從第二位開始 每次列舉最高位j 並找到k 使得j-k>=2

}int work(int x) //計算<=x的windy數

//分為幾個板塊 先求len-1位的windy數 必定包含在區間裡的

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

}//然後是len位 但最高位=1;i--)

if(abs(a[i+1]-a[i])<2) break;

if(i==1) ans+=1;

}return ans;

}int main()

數字DP 不要62 (入門)

problem description 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 ...

DP 數字 DP 不要62

水一篇題解。掌握了數字 dp 的套路之後,10分鐘就可敲出這道題目。題目 不要62 做法 動態規劃 狀態表示 f i j f i j f i j 表示 i ii 位數,最高位是 j jj 的合法數字個數。預處理 只要不含4並且相鄰兩位不是6 2即可累加 狀態轉移步驟 1 不選最大可填數時 累加 2 ...

不要62(數字DP)

description 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 62315 73...