最佳加法表达式

//子问题:假定数字串长度是n 将一个加号添加在第i个数字后 整个式子的最小值等于在前i个数中插入m-1个加号所能形成的最小值加上第i+1到第n个数字所组成的数的值

// vmn)表示表达式的最小值

//m=0 n个数字的值

//n<m+1 v(m,n)=∞

//v(m,n)=min(v(m-1,i)+num(i+1,n))

#include <iostream>

#include <cmath>

using namespace std;

int a[1000], v[1000][1000];

int num(int x, int y){

    int Num = 0, i, t;

    t = y - x;

    for( i = x; i <= y; i ++){

        Num += a[i] * pow(10, t);

        t--;

    }

    return Num;

}

int V(int m,int n)

{

    int sum, i;

    int t;

    if(m == 0){

        return num(1, n);

    }

    else if(n < m+1){

        for( i = 1; i <= n; i ++){

            sum += a[i];

        }

        return sum;

    }

    else

    {

        t = 1000;

        for(int i = m;i <= n-1;i++)

            t = min(t, V(m-1,i)+num(i + 1, n));//这里的递归没有搞懂

        return t;

    }

}

int main(int argc, const char * argv[]) {

    int i, m, n, ans;

    scanf("%d%d",&m, &n);

    for( i = 1; i <= n; i ++){

        scanf("%d", &a[i]);

    }

    for( i = 0; i < n; i ++){

        v[0][i] = num(1, i);

    }

    ans = V(m, n);

    printf("%d\n", ans);

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值