虽然大三上学期学习了动态规划算法,可也只是简单地了解什么是动态规划算法,纸上谈兵而已,并没有真正地将这种算法运用到解题中,没有真正体会到动态规划算法的妙处。最近在准备CCF,有一道往年题目需要运用到动态规划,我将这道题认真的敲了一下,也上网查阅参考了各位大神的代码。收获颇丰。
我的体会如下:
算法的学习是需要实践的。不要想着先学习了理论再去敲代码的想法已经过时了。说说我的想法吧。看到这道题目后,我首先想到的是运用排列组合思想求出公式,甚至拿出算法书要补充这方面的知识后再来写这道题目。但是由于拖延症,我将这道题目放了两天没去管它。眼见着CCF复习坚持不下去了。于是我逼着自己,硬着头皮,开始敲代码。实在不会,就上网查,终于理解了思路,并写出了独属于我的C语言代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
long mod = 1000000007;
int number;
int i;
long long status[1001][6] = {0};
scanf("%d",&number);
for (i = 1; i < number + 1; i ++)
{
status[i][0] = 1;
status[i][1] = (status[i - 1][1] * 2 + status[i - 1][0]) % mod;
status[i][2] = (status[i - 1][2] + status[i - 1][0]) % mod;
status[i][3] = (status[i - 1][3] * 2 + status[i - 1][1]) % mod;
status[i][4] = (status[i - 1][4] * 2 + status[i - 1][2] + status[i - 1][1]) % mod;
status[i][5] = (status[i - 1][5] * 2 + status[i - 1][4] + status[i - 1][3]) % mod;
}
printf("%lld\n",status[number][5]);
return 0;
}