您的位置:首页 > 其它

最佳加法表达式

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

// v(m,n)表示表达式的最小值

//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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: