HDU 2089 不要62 數字DP

2021-07-08 19:59:59 字數 2936 閱讀 9740

problem description

杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。

杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。

不吉利的數字為所有含有4或62的號碼。例如:

62315 73418 88914

都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。

你的任務是,對於每次給出的乙個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。

input

輸入的都是整數對n、m(0

output

對於每個整數對,輸出乙個不含有不吉利數字的統計個數,該數值佔一行位置。

sample input

1 100

0 0

sample output

80

#include //tle

int main()

t /= 100;

}t = i;

while (t)

t /= 10;

}if (flag1&&flag2) sum--;//都含

} printf("%d\n",m-n+1-sum);

} return 0;

}

#include //又tle了!

#include #define maxn 1000010

char buf[maxn];

int main()

if (strstr(buf, "62") != null)

if (flag1&&flag2) sum--;//都含

} printf("%d\n", m - n + 1 - sum);

} return 0;

}

以上兩種版本稍稍改進下,進行預處理,發現光是預處理就tle了!甚至自己的機器上都得不到結果!因為預處理用時太長,還沒跑完!

#include #include #define maxn 1000010

int sum[maxn], ans[maxn];

int main()

t /= 10;

}} ans[i] = i - sum[i];

} //freopen("in.txt", "r", stdin);

//freopen("out.txt", "w", stdout);

int n, m;

while (~scanf("%d%d", &n, &m) &&(n||m))

return 0;

}

#include #include #define maxn 1000010

char buf[maxn];

int sum[maxn], ans[maxn];

int main()

ans[i] = i - sum[i];

} //freopen("in.txt", "r", stdin);

//freopen("out.txt", "w", stdout);

int n, m;

while (~scanf("%d%d", &n, &m) && n)

return 0;

}

網搜數字dp,思路如下。

初探數字dp

基礎知識:

[l,r] 意為 l<=且<=r的數;

[l,r) 意為 l<=且< r的數;

(l,r] 意為 l< 且<=r的數;

(l,r) 意為 l< 且< r的數

方括號意味著取等,小括號意味著不取等

基本思想和方法:

oi中經常需要統計區間[l,r]的滿足題意的數的個數,這往往可以轉換成求[0,r]-[0,l)

對於求區間[0,n)有乙個通用的方法。對於乙個小於n的數,肯定是從高位到低位出現某一位如 n = 58 n為十進位制數。x =49 此時x的十位有了上述性質,我們就可以從高到低列舉第一次說明:

預處理f陣列。

f[i,st] 代表位數為i(可能允許前導0。如00058也是個5位數),狀態為st的方案數。這裡st根據題目需要確定。

如i=4,f[i,st]也就是0000~9999的符合條件的數的個數(十進位制)

決策第i位是多少(such as 0~9)

f[i,st] = f[i,st] + f[i–1,st'],st'為相對應的狀態。

參照剛剛所說的基本思路。預處理f陣列,然後統計[0,m]- [0,n)。f[i,j]代表開頭是j的i位數中不含"62"或"4"的數有幾個。

如f[2,6]包含60,61,63,65,66,67,68,69

for(int i=1;i<=7;i++)

}}

#include #include int dp[8][10];//dp[i][j]表示第i位是數字j時符合條件的數字個數

int digit[9];//digit[i]表示n從右到左第i位的數字

int i, j, k;

void init()//預處理

if (digit[i] == 4 || (digit[i] == 2 && digit[i + 1] == 6)) break;

//第i位已經不滿足條件了,則i位以後就不可能滿足條件,跳出迴圈

} return ans;

}int main()

}

HDU2089 不要62 數字DP

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

Hdu2089 不要62 數字dp

include includeint dp 10 3 dp i 0 為位數小於等於i且不含62也不含4的數字的個數 dp i 1 為位數為i且首位為2且不含62也不含4的數字的個數 dp i 2 為位數小於等於i且含62或4的數字的個數 int digit 10 void er int wei in...

hdu 2089 不要62 (數字dp)

思路 用變數記錄吉利數,和最高位為2的吉利數還有不是吉利數的個數。code include include includeusing namespace std int dp 10 3 dp i j i表示位數,j表示狀態 dp i 0 表示不存在不吉利數字 dp i 1 表示不存在不吉利數字,且最...