动态规划----颜料涂墙问题
来源:互联网 发布:淘宝好还是天猫好 编辑:程序博客网 时间:2024/05/01 17:32
问题描述:
有一面长度为n(n<=10000)的墙,如果要将每单位长度的墙涂上红、绿、篮其中的一种颜色,而且红色墙右边不能紧邻绿色的墙,绿色的墙右边不能紧邻蓝色的墙,请问有几种涂色的方法?
0代表红色,1代表绿色,2代表蓝色
初始值F(1, 0) = F(1, 1) = F(1, 2) = 1;
状态转移方程:
for(n>1)
F(n, 0) = F(n-1, 0)+F(n-1, 1)+F(n-1, 2)
F(n, 1) = F(n-1, 1)+F(n-1, 2)
F(n, 0) = F(n-1, 0)+F(n-1, 2)
下边两种代发原理是相同的,一种采用无记录的方式,另外采用一种有记录的方式:
方法一:无记录
#include<iostream>#include<algorithm>#include<ctime>using namespace std;long long f(int n, int c, long long *p){if (n == 1 && c == 0)return 1;if (n == 1 && c == 1)return 1;if (n == 1 && c == 2)return 1;if (c == 0) p[n] = f(n - 1, 0, p) + f(n - 1, 1, p) + f(n - 1, 2, p);//如果结尾颜色为红色if (c == 1)p[n] = f(n - 1, 1, p) + f(n - 1, 2, p);//如果结尾颜色为绿色if (c == 2)p[n] = f(n - 1, 0, p) + f(n - 1, 2, p);////如果结尾颜色为蓝色return p[n];}int main(){int n;int c[] = { 0, 1, 2 };while (cin >> n){long long *p = new long long[n + 1];memset(p, -1, sizeof(long long)*(n + 1));time_t t1, t2;t1 = clock();int f1 = f(n, 0, p);int f2 = f(n, 1, p);int f3 = f(n, 2, p);t2 = clock();cout << f1 + f2 + f3 <<"\t耗时:"<<(double)(t2-t1)/CLOCKS_PER_SEC<< endl;}printf("%s %s\n", __DATE__, __TIME__);system("pause");return 0;}
运行结果:
105842 耗时:015396655 耗时:0.047184983377 耗时:0.2181911584946 耗时:0.6262026931732 耗时:1.0762162608681 耗时:2.57522145547525 耗时:5.71123338356945 耗时:13.288^ZAug 25 2016 10:36:34请按任意键继续. . .
从运算结果我们可以看到,这种无记录的计算方式是非常耗时的!!
方法二:有记录
#include<iostream>#include<algorithm>#include<ctime>using namespace std;long long f(int n, int c, long long **p){if (p[n][c] != -1)return p[n][c];long long m;if (n > 1){if (c == 0)m = p[n][0] = f(n - 1, 0, p) + f(n - 1, 1, p) + f(n - 1, 2, p);//如果结尾颜色为红色if (c == 1)m = p[n][1] = f(n - 1, 1, p) + f(n - 1, 2, p);//如果结尾颜色为绿色if (c == 2)m = p[n][2] = f(n - 1, 0, p) + f(n - 1, 2, p);////如果结尾颜色为蓝色}return m;}int main(){int n;int c[] = { 0, 1, 2 };while (cin >> n){long long **p = NULL;p = (long long **)malloc((n+1) * sizeof(long long *));//申请一个动态的二维数组for (int i = 0; i < n+1; ++i)p[i] = (long long *)malloc(3*sizeof(long long));//定义行for (int i = 0; i < n+1; ++i){for (int j = 0; j < 3; ++j)p[i][j] = -1;}p[1][0] = 1;p[1][1] = 1;p[1][2] = 1;time_t t1, t2;t1 = clock();long long f1 = f(n, 0, p);long long f2 = f(n, 1, p);long long f3 = f(n, 2, p);t2 = clock();cout << f1 + f2 + f3 << "\t共耗时:" << (double)(t2 - t1) / (CLOCKS_PER_SEC) << endl;for (int i = 0; i < n + 1; ++i)free(p[i]);free(p);}cout << __DATE__ << " " << __TIME__ << endl;system("pause");return 0;}
105842 共耗时:015396655 共耗时:02026931732 共耗时:02162608681 共耗时:022145547525 共耗时:023338356945 共耗时:0251828587033 共耗时:030124155792775 共耗时:0358429820731201 共耗时:0^ZAug 25 2016 10:40:00请按任意键继续. . .
0 0
- 动态规划----颜料涂墙问题
- acm 1010颜料问题
- 动态规划----贪心的动态规划问题
- 动态规划问题
- 动态规划问题
- 动态规划回文问题
- 动态规划 背包问题
- 【动态规划】背包问题
- 动态规划问题
- 动态规划问题
- 【动态规划】加油问题
- 动态规划基本问题
- 动态规划-背包问题
- 动态规划问题
- 动态规划基本问题
- 动态规划---->货郎担问题
- 动态规划+背包问题
- 乘法问题(动态规划)
- POJ_1000_A+B Problem
- jquery 对select 的操作
- 数据结构实验之排序七:选课名单
- iOS开发之核心动画
- iOS开发 initWithFrame和initWithCoder的区别
- 动态规划----颜料涂墙问题
- react-native的简单介绍于在Mac下的配置安装
- Android手机横竖屏切换小结
- 源码解析java中的哈希表HashMap
- 为拍摄的RGB数据加上BMP文件头
- hdu3401 Trade(单调队列优化dp)
- html页面保存成图片,图片写入pdf
- Android M新特性Doze and App Standby模式详解
- Android中的视频传输