DP----最佳加法表达式
小白近日沉迷算法不可自拔
今天看到了非常经典的最佳加法表达式的题目
题意:
给M个数字,在其中添加N个加号,使得结果最小
理解:
分解成子问题—求在 M-1 个数中放加号 + 加号后的数值
准备:
- 定义一个函数Number(a,b)计算从a到b这些数的数值
- 用数组将上面计算的数值存储记忆,防止重复计算
- 转移表达式: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;
}
程序可以跑成功,
希望大家发现不足帮忙指正,一起加油!