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