您的位置:首页 > 其它

lightoj 1068 数位DP

2013-09-28 10:10 375 查看
终于AC了



一直超时。。。。。。

注意dp的设定。。。。。。






开始的时候一直是内存超了



注意一点就是当K〉=95之后结果一定是0.。。。。。。。。。。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

int digit[20];
int dp[11][95][95][2];
int K;

int DFS( int pos, int pre, int pre_sum, bool limit ){
if( pos == 0 ){
return pre == 0 && pre_sum == 0;
}
if( !limit && dp[pos][pre][pre_sum][limit==1] != -1 ){
return dp[pos][pre][pre_sum][limit==1];
}

int end = limit ? digit[pos] : 9;
int sum = 0;
for( int i = 0; i <= end; i++ ){
sum += DFS( pos - 1, ( pre * 10 + i ) % K, ( pre_sum + i ) % K, limit && i == end );
}

return dp[pos][pre][pre_sum][limit==1] = sum;
}

int solve( int N ){
int len = 0;
while( N ){
digit[++len] = N % 10;
N /= 10;
}
return DFS( len, 0, 0, true );
}

int main(){
int T, Case = 1;
int A, B;

cin >> T;
while( T-- ){
memset( dp, -1, sizeof( dp ) );
cin >> A >> B >> K;
if( K >= 95 ){
cout << "Case " << Case++ << ": " << 0 << endl;
continue;
}
cout << "Case " << Case++ << ": " << solve( B ) - solve( A - 1 ) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: