AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
100个A
是这个100(A)
ans是6
但是我的程序会输出5,原因是40行dick变量太小了,没有判三位数100的情况
#include<bits/stdc++.h>
#define int long long
#define inf 1e18
using namespace std;
string ch;
int dp[110][110]; //dp[l][r]
/*
dp[l][r] = min(dp[l][k] + dp[k+1][r])
*/
bool check(int left, int right, int k) {
int len = k-left+1;
if((right - left + 1) % len != 0) {
return false;
}
for(int i=left; i+len-1<=right; i+=len) {
if(ch.substr(i, len) != ch.substr(left, len)) {
return false;
}
}
return true;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> ch; int n = ch.length();
ch = " " + ch;
for(int i=1; i<=n; ++i) {
dp[i][i] = 1;
}
for(int len=2; len<=n; ++len) {
for(int left=1; left+len-1<=n; ++left) {
int right = left + len - 1;
dp[left][right] = inf;
for(int k=left; k<right; ++k) {
dp[left][right] = min(dp[left][k] + dp[k+1][right], dp[left][right]);
}
for(int k=left; k<=right; ++k) {
if(check(left, right, k)) {
int len = k - left + 1;
int dick = (right - left + 1) / len;
if(dick / 10 != 0) {
dp[left][right] = min(dp[left][right], dp[left][k] + 4);
} else {
dp[left][right] = min(dp[left][right], dp[left][k] + 3);
}
}
}
}
}
cout << dp[1][n];
return 0;
}