题目如下,
这个题目可以往我们更容易理解,更常见的问题上去类比,
想象一下跳台阶,或者扔骰子游戏,每个台阶k上可以跳的步数记录在数组{}中,
如,位置1可以跳[1,2,3,5], 位置2可以跳[1,3,13] 步
求怎样最少的次数跳到终点,
这样就很好理解了,从开始位置出发,在每一个位置上,把可以跳到的位置上标记一下步数,
就可以得到最小步数了
示例
class Solution {
public:
bool ispa(string& s, int b, int e) {
while (b < e) {
if (s[b] != s[e]) {
return false;
}
b++;
e--;
}
return true;
}
int minCut(string s) {
int len = s.length();
vector<vector<int>> v;
//get stride
for (int i = 0; i <= len-1; i++) {
vector<int> t;
for (int j = i+1; j <= len-1; j++) {
if (ispa(s, i, j)) {
t.push_back(j-i);
}
}
v.push_back(t);
}
//
vector<int> d(len+1, len+1);
d[0] = 0;
for (int i = 0; i <= len-1; i++) {
if (d[i]+1 < d[i+1]) {
d[i+1] = d[i]+1;
}
for (int k = 0; k < v[i].size(); k++) {
int p = i+v[i][k] + 1;
// d[p] = min(d[i]+1, d[p]);
if (d[i]+1 < d[p]) {
d[p] = d[i]+1;
}
//
// if (p == len) {
// return d[len] - 1;
// }
}
}
return d[len] - 1;
}
};