您的位置:首页 > 其它

hdu 3555 Bomb 数位dp

2013-05-16 20:45 381 查看
/*
hdu 2089的简化
*/

#include<iostream>
using namespace std;
__int64 dp[22][3];

void run1()
{
int i;
dp[0][0] = 1;
dp[0][1] = dp[0][2] = 0;
for( i=1; i <= 21; i++ )
{
dp[i][0] = dp[i-1][0]*10 - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2]*10 + dp[i-1][1];
}
}

__int64 run(__int64 n)
{
int i, l=0, a[22];
__int64 s = 0;
a[0] = 0;
while(n)
{
a[++l] = n % 10;
n /= 10;
}
a[l+1] = 0;
bool p = false;
for( i=l; i > 0; i-- )
{
s += dp[i-1][2] * a[i];
if(p)
s += dp[i-1][0] * a[i];
else if(a[i] > 4)
s += dp[i-1][1];
if(a[i+1] == 4 && a[i] == 9)
p = true;
}
if(p) s++;
return s;
}

int main()
{
run1();
int n;
scanf("%d", &n);
while(n--)
{
__int64 m;
scanf("%I64d", &m);
printf("%I64d\n", run(m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: