首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

数位DP习题

2013-10-29 
数位DP练习ural 1057 Amount of Degrees (数位DP)详见:刘聪的论文,写的很详细......#include cstdio#inc

数位DP练习


ural 1057 Amount of Degrees (数位DP)


详见:刘聪的论文,写的很详细......


#include <cstdio>#include <iostream>#include <cmath>#include <cstring>using namespace std;int f[11][11];int n,m;int pos[11];void init() {    memset(f,0,sizeof(f));    f[0][0] = 1;    for(int i=1; i<7; i++) {        for(int j=0; j<=9; j++) {            if(j == 4) continue;            for(int k=0; k<=9; k++) {                if(j == 6 && k == 2) continue;                f[i][j] += f[i-1][k];            }        }    }}int solve(int x) {    memset(pos,0,sizeof(pos));    int len = 0;    int flag = 1;    while(x) {        pos[++len] = x % 10;        if(pos[len] == 4 || (pos[len] == 6 && pos[len-1] == 2)) flag = 0;        x /= 10;    }    int ans = 0;    if(flag) ans ++;    for(int i=len; i>=1; i--) {        for(int j=0; j<pos[i]; j++) {            if(j == 4) continue;            if( i < len && pos[i+1] == 6 && j == 2) continue;            ans += f[i][j];        }        if(pos[i] == 4 || (i < len && pos[i+1] == 6 && pos[i] == 2)) break;    }    return ans;}int main() {    init();    while(scanf("%d%d",&n,&m)) {        if(n == 0 && m == 0) break;        printf("%d\n",solve(m) - solve(n-1));    }    return 0;}



热点排行