nyoj 0269 VF
Posted kindleheart
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj 0269 VF相关的知识,希望对你有一定的参考价值。
意思大致为从1-10^9数中找到位数和为s的个数
分析:利用动态规划思想,一位一位的考虑,和s的范围为1-81
状态定义:dp[i][j] = 当前所有i位数的和为j的个数
除了最高位的取值为1-9(最高位不能为0),其余位的取值都为0-9,所有我们可以最开始初始化dp[1][j](1 <= j <= 9) = 1.假如我们求dp[5][9]当前所有5位数的和为9的个数,那么我们需要考虑0-9这10个数的情况,
如果此时个位(即第5位)的值为6,那么我们需要得知dp[4][9-6]的值,因为和为9,且此时个位(第五位)为6,那么前4个数和必须为3才满足和为9,那么dp[5][9] += d[5-1][9-6];
由此很容易得到状态转移方程:dp[i][j] = dp[i-1][j-k];
注意!!!:1000000000不能忽视,最后和为1的结果必须再加1;
代码:
#include<bits/stdc++.h> using namespace std; int dp[10][81]; int main() { memset(dp, 0, sizeof(dp)); for(int i = 1; i <= 9; i++) dp[1][i] = 1; for(int i = 2; i < 10; i++) { int c = i*9; for(int j = 1; j <= c; j++) { for(int k = 0; k < j && k <= 9; k++) dp[i][j] += dp[i-1][j-k]; } } for(int i = 2; i <= 9; i++) { for(int j = 1; j <= 81; j++) dp[i][j] += dp[i-1][j]; } dp[9][1]++;//1000000000的情况 int s; while(scanf("%d", &s) == 1) printf("%d\n", dp[9][s]); return 0; }
以上是关于nyoj 0269 VF的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门19:Fragment shader - 片段级模型动态变色