51nod 1043 幸运号码 (数位dp)

dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况)

dp[i][j] = dp[i-1][j-k]

i & 1 :这里用滚动数组节省内存

非0开头的情况 * 0开头的情况:(dp[n&1][i]-dp[(n-1)&1][i]) *dp[n&1][i],最后将其累加即为结果。

开始没有想到这么做,还傻傻的dfs,用dp[1000][10]记录,今天心情不好,超级不好,做着做着放弃了。

#include
using namespace std;
typedef long long ll;
#define pb push_back
const int mod=1e9+7;
const int inf = 0x3f3f3f3f;

const int N = 1001;
int n;
long long dp[2][9*N];//i个数和为j的数量

int main(){
scanf("%d",&n);
memset(dp,0,sizeof(dp));
int sum;
 for(int i = 0; i <= 9; ++i)
        dp[1][i] = 1;
        for(int i=2;i<=n;i++)
            for(int j=0;j<=9*i;j++)
        {
            sum=0;
            for(int k=0;k<=9;k++)
                {if(j


你可能感兴趣的:(ACM-dp,51nod)