問題
http://community.topcoder.com/stat?c=problem_statement&pm=13731&rd=16434
解き方
dpの問題。
dp[現在調べている桁数][beautifulcountの数][10の連続数]=そのbeautifulcountの総数
とすると、前の結果について以下のようになる。
1:前の結果から10が連続しないように1桁追加
→連続数が1になり、beautifulcountが1増える
2:前の結果から10が連続するように1桁追加
→連続数が1増えて、beautifulcountが連続数+1個増える
コード
class DevuAndBeautifulSubstrings {
public: long long countBeautifulSubstrings(int n, int cnt) {
int num=n*(n+1)/2;
long long dp[n+1][num][n+1];
memset(dp,0,sizeof(dp));
dp[1][1][1]=2;
for(int i=1;i<n;i++)for(int j=0;j<=num;j++)for(int prev=0;prev<=n;prev++){
if(dp[i][j][prev]!=0){
dp[i+1][j+1][1]+=dp[i][j][prev];
dp[i+1][j+1+prev][prev+1]+=dp[i][j][prev];
}
}
long long ret=0LL;
FORE(i,0,n+1)ret+=dp[n][cnt][i];
return ret;
}
};
public: long long countBeautifulSubstrings(int n, int cnt) {
int num=n*(n+1)/2;
long long dp[n+1][num][n+1];
memset(dp,0,sizeof(dp));
dp[1][1][1]=2;
for(int i=1;i<n;i++)for(int j=0;j<=num;j++)for(int prev=0;prev<=n;prev++){
if(dp[i][j][prev]!=0){
dp[i+1][j+1][1]+=dp[i][j][prev];
dp[i+1][j+1+prev][prev+1]+=dp[i][j][prev];
}
}
long long ret=0LL;
FORE(i,0,n+1)ret+=dp[n][cnt][i];
return ret;
}
};