柚子快报激活码778899分享:算法 数塔问题(动态规划法)
题目
利用动态规划法求解高度为n的数塔,塔中的元素为0-20以内的随机数。
代码
#include
#include
#include
int a = 0;
int* num=&a;
int DataTorwer(int d[100][100], int n){
int i, j, maxAdd[100][100] = { 0 }, path[100][100] = { 0 };
for (j = 0; j < n; j++) //初始子问题
maxAdd[n - 1][j] = d[n - 1][j];
for (i = n - 2; i >= 0; i--) //进行第i层的决策
for (j = 0; j <= i; j++) { //只填写下三角
a++; //基本语句执行次数
if (maxAdd[i + 1][j] > maxAdd[i + 1][j + 1]){
maxAdd[i][j] = d[i][j] + maxAdd[i + 1][j];
path[i][j] = j; //本次决策选择下标j的元素
}
else{
maxAdd[i][j] = d[i][j] + maxAdd[i + 1][j + 1];
path[i][j] = j + 1; //本次决策选择下标j+1的元素
}
}
printf("路径为:%d", d[0][0]); //输出顶层数字
j = path[0][0]; //计算maxAdd[0][0]的选择
for (i = 1; i < n; i++)
{
printf("-->%d", d[i][j]);
j = path[i][j]; //计算maxAdd[i][j]的选择
}
return maxAdd[0][0]; //返回最大数值和
}
int main()
{
int n=0, d[100][100] = { 0 };
printf("问题规模为:");
scanf_s("%d", &n);
srand((int)time(0)); //产生随机数种子
for (int i = 0; i < n; i++) { //给数组元素随机赋值
for (int j = 0; j < i+1; j++) {
d[i][j] = rand() % 20;
printf("%3d ", d[i][j]);
}
printf("\n");
}
printf("\n");
printf("最大数值和是:%d\n", DataTorwer(d, n));
printf("基本语句频度为:%d", *num);
return 0;
}
运行结果
柚子快报激活码778899分享:算法 数塔问题(动态规划法)
推荐链接
发表评论