最佳加法表达式(DP)

简介: 题目:有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少思路: 添加完加号后,表达式的最后一个加号在第i个数字后面,那么整个表达式的最小值,则等于前i个数的m-1最佳加法表达式,加上i+1到n组成的数。

题目:有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少

思路:
添加完加号后,表达式的最后一个加号在第i个数字后面,那么整个表达式的最小值,则等于前i个数的m-1最佳加法表达式,加上i+1到n组成的数。//V(i,m-1)+num[i+1][n]

V(n,m)表示在n个数字中插入m个加号所能形成的表达式的最小值。

num[i][j]表示从第i个数到第j个数字所组成的数 

           Num[1][n];  n个数字构成的整数 //当m = 0
V(n,m) =  INF  //当m+1 > n
           Min{V(i,m-1) + Num(n, i+1)} (i = m ... n-1) //else

#include<iostream>  
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f;
int sz[1000]; 
int num[1000][1000];
int n,m;
int V(int n, int m) {
    if (m == 0) {
        return num[1][n];
    } else if (m+1 > n) {
        return INF; 
    } else { //m < n
        int ans = INF;
        for (int i = m; i <= n-1; i++) //最后一个数字后不放+号 
            ans = min(ans, V(i,m-1)+num[i+1][n]);

        return ans;
    }
}
int main() {
    while (cin >> n >> m) {
        for (int i = 1; i <= n; i++) 
            cin >> sz[i];

        //预处理,num[i][j]表示从第i个数到第j个数字所组成的数   
        for(int i = 1; i <= n; i++) {
            num[i][i] = sz[i];
            for (int j = i+1; j <= n; j++) {
                num[i][j] = num[i][j-1]*10 + sz[j];
            }           
        }
        cout << V(n,m) << endl; 
    }
    return 0;
}
目录
相关文章
|
6月前
|
Go
go算数运算、关系运算、布尔运算、位运算
go算数运算、关系运算、布尔运算、位运算
|
7月前
|
存储 C++
C/C++中的整数除法运算与汇编指令DIV和IDIV
C/C++中的整数除法运算与汇编指令DIV和IDIV
210 1
|
算法
P1226 【模板】快速幂||取余运算
P1226 【模板】快速幂||取余运算
61 0
|
7月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
87 1
|
7月前
|
SQL 存储 数据库
SQL 算术运算符:加法、减法、乘法、除法和取模的用法
存储过程是一段预先编写好的 SQL 代码,可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元,并为其分配一个名称,以便在需要时调用执行。存储过程可以接受参数,使其更加灵活和通用。
177 0
|
C语言
赋值运算和赋值表达式
赋值运算和赋值表达式。
216 0
|
人工智能 Shell
if 运算表达式
if 运算表达式
67 1
|
算法
不使用+或-运算符,计算两数之和
不使用+或-运算符,计算两数之和
88 0
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
125 0
【C++之重载类型转换运算符】复数与 double 数相加
【C++之重载类型转换运算符】复数与 double 数相加