【动态规划】数字三角形c语言

本学期的的算法实践课的实验作业。写的不好请大家多多指教。

【题目】

试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字总和最大。

    数据输入:

    由文件input.txt提供输入数据。文件的第一行是数字三角形的行数,该数字在1到100之间。接下来n行是数字三角形各行中的数字。所有数字在0至99之间。

    结果输出:

    程序运行结束时,将计算结果输出到文件output.txt中。文件第一行中的数字是计算出的最大值。

输入文件实例:

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

int ReadFile(const char name[200], int input[20][20], int& sum)//读取txt文件内的内容
{
	int a[20][20];
	FILE* fp;
	fp = fopen(name, "r");
	if (fp == NULL)
	{
		printf("File cannot open!");
		return 0;
	}
	fscanf(fp, "%d", &sum);//记录三角形的行数
	for (int i = 0; i < sum; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			fscanf(fp, "%d", &input[i][j]);//将数字三角形的数字存入数组
		}
	}
	fclose(fp);
}
int WriteFile(const char name[200],int maxSum, int a[20], int& sum)//将结果写入另一个txt文件
{
	FILE* fp;
	fp = fopen(name, "w");
	if (fp == NULL)
	{
		printf("File cannot write!");
		return 0;
	}
	fprintf(fp,"最大路径和为:%d",maxSum);//将数字三角形的最大路径和写进另一个txt文件内
	fprintf(fp, "\n");
	fprintf(fp, "路径为:");
	for (int i = 0; i < sum; i++)//写入路径
	{
			fprintf(fp, "%d  ",a[i]);//
	}
	fclose(fp);
	return 1;
}

int FindMax(int input[20][20],int output[20][20], int& sum)//找到最大路径和
{
	for (int i = sum - 2; i >=0; i--)
	{
		for (int j = 0; j <=i; j++)
		{
			if (input[i][j] + input[i + 1][j] > input[i][j] + input[i + 1][j + 1])
			{
				input[i][j] = input[i][j] + input[i + 1][j];
				output[i][j] = input[i][j];
			}else {
				input[i][j] = input[i][j] + input[i + 1][j + 1];
				output[i][j] = input[i][j];
			}
		}
	}
	printf("最大路径和为:%d",input[0][0]);//在控制台输出最大路径和
	printf("\n");
	
	return input[0][0];
}
int FindRode(int a[20][20],int b[20][20],int d[20],int& sum)//路径
{
	int num;
	int t = 0;
	printf("路径为:");
	for (int s = 0; s <sum; s++)//打印路径,将路径存入一维数组
	{
	     num = a[s][t];
		 d[s] =num;
		printf("%d  ", a[s][t]);
		if (a[s][t] + b[s + 1][t] < a[s][t] + b[s + 1][t + 1])
		{
			t = t + 1;
		}
	}
	printf("\n");
	return 1;
}


int main(int argc, char* argv[])
{
	int input[20][20];
	int output[20][20];
	int a[20][20];
	int b[20];
	int sum;
	int k;
	ReadFile("F:\\input.txt",input, sum);
	for (int i = 0; i < sum ; i++)//将数字三角形存入数组
	{
		for (int j = 0; j <= i; j++)
		{
			a[i][j] = input[i][j];
		}
	}
	k = FindMax(input, output, sum);
	FindRode(a,output,b,sum);
	WriteFile("F:\\output.txt",k,b,sum);

	return 0;
}

【运行结果】 

 

 

 

 

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值