Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 最小断串代价的动态规划_String_Algorithm_Dynamic Programming - Fatal编程技术网

String 最小断串代价的动态规划

String 最小断串代价的动态规划,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,某种字符串处理语言提供了一种将字符串拆分为两段的基本操作。由于此操作涉及复制原始字符串,因此长度为n的字符串需要n个时间单位,而与剪切位置无关。现在,假设你想把一根绳子断成许多段。中断的顺序会影响总运行时间。例如,如果要在位置3和10处剪切一个20个字符的字符串,则在位置3处进行第一次剪切将产生20+17=37的总成本,而在位置10处进行第一次剪切的成本更高,为20+10=30 给出一个动态规划算法,给定长度为n的字符串中m个切割的位置,找到将字符串拆分为m+1段的最小成本 这个问题来自“算法”

某种字符串处理语言提供了一种将字符串拆分为两段的基本操作。由于此操作涉及复制原始字符串,因此长度为n的字符串需要n个时间单位,而与剪切位置无关。现在,假设你想把一根绳子断成许多段。中断的顺序会影响总运行时间。例如,如果要在位置3和10处剪切一个20个字符的字符串,则在位置3处进行第一次剪切将产生20+17=37的总成本,而在位置10处进行第一次剪切的成本更高,为20+10=30

给出一个动态规划算法,给定长度为n的字符串中m个切割的位置,找到将字符串拆分为m+1段的最小成本

这个问题来自“算法”第6.9章

既然这个问题没有答案,我就是这么想的

OPT(i,j,n)
定义为断开字符串的最小成本,
i
定义为开始索引,
j
定义为字符串的结束索引,
n
定义为我可以使用的剩余切割数

以下是我得到的:

OPT(i,j,n)=min{OPT(i,k,w)+OPT(k+1,j,n-w)+j-i}
{
int l,p;
内部温度=0;
//ArrayList al=新的ArrayList();
国际标准[];
扫描仪s=新的扫描仪(System.in);
int表[];
ArrayList值[];
int低=0,高=0;
int min=0;
l=s.nextInt();
p=s.nextInt();
System.out.println(“值为“+l+”+p);
表=新整数[l+1][l+1];
值=新数组列表[l+1][l+1];
al=新整数[p];

对于(int i=0;i我认为你的递归关系可以变得更好。下面是我得出的结论,将cost(i,j)定义为将字符串从索引i剪切到j的成本。然后

cost(i,j) = min {length of substring + cost(i,k) + cost(k,j) where i < k < j}
cost(i,j)=最小{子串长度+cost(i,k)+cost(k,j),其中i
实现并测试它?提示:你需要
n
参数吗?:@j\u random\u hacker这件事已经困扰了我好几天了。我想不出为什么不需要n参数。如果你知道答案,请告诉我,谢谢!我明白为什么我的解释让你感到困惑了!不要使用I和j作为索引(位置)在字符串中,将它们视为块编号。在字符串中有M 1个块,由需要进行的M切割定义。例如,在该示例中,有3个块:1-3、4-10和11-20(假设“在位置3处剪切”表示“位置3之后的剪切”)。提示:它包含每个块的结束位置(或起始位置)的数组。
cost(i,j) = min {length of substring + cost(i,k) + cost(k,j) where i < k < j}