最佳加法表达式
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;
}
将一个加号添加在第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;
}