本文主要是介绍Project Euler_Problem 172_Few Repeated Digits_动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原题目:
题目大意:18位数里头,有多少个数,对于每个数字0-9,在这18位里面出现均不超过3次
111222333444555666 布星~~
112233445566778899 可以~~
解题思路:
动态规划
代码:
ll F[19][3000000];void solve() {ll i, j,k,x,y,z,p,q,u,v;ll N = 18,NN=4;double a, b, c,d;F[0][0] = 1;for (i = 1; i <= N; i++) {for (j = 0; j <= 9; j++) {if (j == 0 && i == N)continue;for (k = 0; k <= (1 << 21); k++) {p = k;u = 0;while (p) {z = (3 & p);u = u + z;p = p >> 2;if (u > i - 1)break;}if (u == i - 1) {p = k;v = 3 & (p >> (2 * j));if (v+1 >= NN)continue;F[i][k + ((ll)1 << (2 * j))] += F[i-1][k];}}}}for (i = 1; i <= (1 << 21); i++) {p = i; u = 0; flag = 1;while (p) {z = (3 & p);u = u + z;if (z > NN) { flag = 0; break; }p = p >> 2;}if (u == N&&flag==1) {printf("%lld %lld\n", i,F[N][i]);ans1 = ans1 + F[N][i];}}printf("%lld\n",ans1);
}
这篇关于Project Euler_Problem 172_Few Repeated Digits_动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!