HDU 2089 필요 없음 62(디지털 dp)

1169 단어
제목 링크: HDU 2089 아니요 62
디지털
수신의 말에 의하면 이것은 디지털 dp의 가장 기초적인 제목이라고 한다. 학습 중이다.
이런 제목을 만들면 기억화 검색이 더 뚜렷하게 나오는 것 같아서요.
dp[pos][0]는 길이가pos+1이고 제pos+2위는 6의 요구에 부합되는 수가 아니다. dp[pos][1]은 길이가pos+1이고 제pos+2위는 6의 요구에 부합되는 수의 합이다.
#include <iostream>
#include <cstring>

using namespace std;

const int MAX_N = 10 + 5;
int dp[MAX_N][2];
int num[MAX_N];
int n,m;

int f(int pos, int st, bool limit)
{
    if(pos == -1)
        return 1;
    if(!limit && dp[pos][st] != -1)
        return dp[pos][st];
    int ans = 0;
    int last = limit ? num[pos] : 9;
    for(int i = 0; i <= last; i++)
    {
        if(i == 4 || (i == 2 && st))
            continue;
        ans += f(pos - 1, i == 6, limit && i == last);
    }
    if(!limit)
        dp[pos][st] = ans;
    return ans;
}
int cal(int n)
{
    int pos = 0;
    while(n > 0)
    {
        num[pos] = n % 10;
        n /= 10;
        pos++;
    }
    return f(pos - 1, 0, 1);
}
int main()
{
    memset(dp, -1, sizeof(dp));
    while(cin >> n >> m, n + m)
        cout << cal(m) - cal(n - 1)<< endl;
    return 0;
}

좋은 웹페이지 즐겨찾기