【问题描述】
给出一个长度为N的数字字符串和一个数字T,要求插入最少的加号或者乘号,使得数字字符串的运算结果为T。运算符*号优先级高于+号,运算数可以有任意个前导0.
【输入格式】
输入不超过5组数据,每组数据两行。
每组数据的第一行为长度N,只包含0~9的数字字符串;第二行为一个数字T。
输入T<0表示输入结束。
【输出格式】
输出一个数字单独占一行,表示最少需要添加的运算符(+号或*号)数,无解输出-1.
【输入样例】
032089
5
333
9
00
-1
【输出样例】
3
2
【数据范围】
对于30%的数据,有1<=N<=10,0<=T<=50.
对于50%的数据,有1<=N<=15,0<=T<=200.
对于全部的数据,有1<=N<=20,0<=T<=300.
【分析】
初看数据很小啊,搜索: 3^N,能过50分,再加优化就不会了。。于是用dp。
1.
f(i,j) 表示前i个元素 和为j 需要的最少符号数;(用加号来分组)
f(i,j)=MIN{f(k,x)+g[1+k][i][j-x] } (1<=k< i && j-x>=0)
2.
组权值数组g[i][j][k]的意义:
在i到j的区间内 乘积为k