摘要:
/*题意:对1到N这些数进行排列,1在最左边,相邻的两个数之差不能超过2,求有多少种排列方法? 思路:已知1在最左边,跟1相邻的只能是2、3。当2跟1相邻时后边的部分就是dp[n-1] 。当3在1后边,2在3后边时,前三位确定,剩下的就是dp[n-3]。最后剩下一种情况,再加1。 dp[i] = dp[i-1] + dp[i-3] + 1;*/#include <iostream>#include <fstream>using namespace std;const int N = 60;long long dp[N];int main(){ //fstream cin 阅读全文
摘要:
/*题意:求【1 to 10^9】范围内各位数字之和为s的数的个数; 思路:定义dp[i][j] (i = 1 to 9, j = 1 to 81),表示位数为i的数各位数之和为j的数的个数。dp[i][j] = (i - 1位数最低位全部补0) + (i - 1位数最高位补j - k {k| 1 <= k <= 9} )。所以转移方程就是 dp[i][j] = dp[i-1][j] + sum(dp[i-1][j - 1] , dp[i-1][j-2] , ... , dp[i-1][j-9]);ps:注意s = 1 的时候是10而不是9,因为10^9也算在s = 1里边My C 阅读全文