DP----最佳加法表达式

DP----最佳加法表达式

小白近日沉迷算法不可自拔
今天看到了非常经典的最佳加法表达式的题目

题意:
给M个数字,在其中添加N个加号,使得结果最小

理解:
分解成子问题—求在 M-1 个数中放加号 + 加号后的数值

准备:

  1. 定义一个函数Number(a,b)计算从a到b这些数的数值
  2. 用数组将上面计算的数值存储记忆,防止重复计算
  3. 转移表达式:tmp = Minnum(i,add-1) + Num[i+1][num];其中i 从n到m-1,找出tmp的最小值。

建立数组:

#include<bits/stdc++.h>
#define MaxSize 101

using namespace std;

//备忘录num[a][b](从A到B的数的数值)
int Num[MaxSize][MaxSize];
int A[MaxSize];

int cnum(int a,int b,int A[]){
	int data = 0,mod = 1;
	for(int i = b;i >= a;i--){
		data += A[i] * mod;
		mod *= 10;
	}
	return data;
}

void CreatNum(int num,int A[]){
	for(int i = 1;i <= num;i++){
		for(int j = i;j <= num;j++){
			Num[i][j] = cnum(i,j,A);
		}
	}
}

动规过程:

int Minnum(int num,int add){
	if(add == 0) return Num[1][num];
	else{
		int min = 1000000;
		for(int i = add;i <= num-1;i++){
			int tmp = Minnum(i,add-1) + Num[i+1][num];
			if(tmp < min) min = tmp;
		}
		return min;
	}
}

在主函数中输入数字个数,加号数,数字

int main()
{
	int num,add;
	cin>>num>>add;
	for(int i = 1;i <= num;i++){
		cin>>A[i];
	}
	
	CreatNum(num,A);
///	IsCreateokey--->
//	for(int i = 1;i <= num;i++){
//		for(int j = i;j <= num;j++){
//			cout<<Num[i][j]<<" ";
//		}
//	}
	cout<<Minnum(num,add);
	
	return 0;
}

程序可以跑成功,
希望大家发现不足帮忙指正,一起加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值