數字dp小練

2021-07-26 13:06:58 字數 1047 閱讀 3449

我是超連結

題意:找0~n中含有「49」的個數

題解:狀態:f[i][j]表示i位數以j開頭的數中不含49的個數 

轉移:if (j!=4 || k!=9) f[i][j]+=f[i-1][k]; (不含49,最後用總數減去不含的就是含有的)

因為資料n+1怕爆longlong,手動+1

**:

#include #include #define ll long long

using namespace std;

//i位數以j開頭的數中不含49的個數

ll f[50][50];

int t,digi[50];ll n,ans;

void dp()

ll find(ll n)

digi[1]++;

for (i=1;i<=cnt;i++)

if (digi[i]>=10) digi[i+1]+=digi[i]/10,digi[i]%=10;

if (digi[cnt+1]) cnt++;

for (i=cnt;i>=1;i--)

ll find(int n)

for (i=cnt;i>=1;i--)

ll find(ll n)

for (i=cnt;i>=1;i--)

int a,amod,bmod;

for (int i=2;i<=10;++i)

for (int j=0;j<13;++j)

if (k==3) f[i][j][2]+=f[i-1][bmod][1]+f[i-1][bmod][2];} }

}int find(int n)

//如果這一位》1的話,要加上不含13但是開頭為3的

if (digit[i]>1)

if (digit[i]==3&&digit[i+1]==1) flag=true;

//最後加上這一位的數

last+=mi[i-1]*digit[i];

}return ans;

}int main()

區間dp小練

提綱 區間dp一般設計f i j 表示區間i到j的dp值,用幾段小的合併成一段整體,也是分治的思想,轉移時列舉中間點k,從f i k f k 1 j 來合併 1.題目 題解 石子歸併 水題開頭 include include include using namespace std int n,a 1...

dp 雜練 專練 round2

上次題似乎有點水 大概到noi之前會進行一些針對自己薄弱點的專項訓練吧 bz oj1419re disg ood 額.dp i j 表示re d剩i張 bla ck剩j 張的期望 每次期望 概率 轉移就行 注意如果期望在 0以下就 不取了 空間不夠 所以滾 一下 code by liuchenrui...

數字DP入門 數字DP模板

數字dp是一種計數用的dp,一般就是要統計乙個區間 le,ri 內滿足一些條件數的個數。所謂數字dp,字面意思就是在數字上進行dp咯。數字還算是比較好聽的名字,數字的含義 乙個數有個位 十位 百位 千位.數的每一位就是數字啦!之所以要引入數字的概念完全就是為了dp。數字dp的實質就是換一種暴力列舉的...