UVa 10198 - Counting
2015-10-26 10:57
162 查看
題目:給你一個數字n,求有多少種1,2,3,4構成的串位數之和為n,4按1計算。
分析:dp,動態規劃,大整數。找到遞推公式:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
首先,設計狀態f(n),為和為n的數字串的種類數;
然後,考慮退化情況,只用1和2組成的數字串,和為n的情況;
這時,我們分兩種情況考慮以1結束和以2結束,因此得到地推關係:f(n)= f(n-1)+ f(n-2);
最後,推廣公式得到1,2,3,4的數字串公式為:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
說明:利用數位壓縮,可以提高效率。
分析:dp,動態規劃,大整數。找到遞推公式:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
首先,設計狀態f(n),為和為n的數字串的種類數;
然後,考慮退化情況,只用1和2組成的數字串,和為n的情況;
這時,我們分兩種情況考慮以1結束和以2結束,因此得到地推關係:f(n)= f(n-1)+ f(n-2);
最後,推廣公式得到1,2,3,4的數字串公式為:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
說明:利用數位壓縮,可以提高效率。
#include <cstring> #include <cstdio> int dp[1001][111]; int main() { memset(dp, 0, sizeof(dp)); dp[1][0] = 2;dp[2][0] = 5;dp[3][0] = 13; for (int i = 4; i < 1001; ++ i) { for (int j = 0; j < 110; ++ j) dp[i][j] = dp[i-1][j]+dp[i-1][j]+dp[i-2][j]+dp[i-3][j]; for (int j = 0; j < 110; ++ j) if (dp[i][j] > 9999) { dp[i][j+1] += dp[i][j]/10000; dp[i][j+0] %= 10000; } } int n, end; while (~scanf("%d",&n)) { end = 110; while (!dp [end] && end) -- end; printf("%d",dp [end --]); while (end >= 0) printf("%04d",dp [end --]); puts(""); } return 0; }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- Uncaught TypeError: Cannot read property 'drawImage' of undefined错误的解决办法
- Virtualbox WDDM之DxgkDdiStartDevice
- 获得到未来6天的天气
- GitLab在Centos下的安装步骤
- Java中正数与负数操作>>、>>>的区别
- "error LNK1169: 找到一个或多个多重定义的符号"另外的解决办法
- 和最大的连续子序列
- linux下环境变量简单配置
- 2014年-2015年我做互联网创业项目的点点滴滴,有成功有失败
- strchr函数
- Core Data
- PHP部分字符串函数汇总
- 设计模式(十五)享元模式(结构型)
- 观后感 - 从MVC到前后端分离
- C_运算符优先级
- React Native 官方文档中文版(含最新Android内容)
- 删除唯一性约束和主键
- Caffe框架,训练model并测试数据
- Caffe框架,训练model并测试数据