这是我 WA 的代码:
#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <bitset>
#include <queue>
#include <map>
#include <set>
#define prt printf
#define ll long long
#define int long long
#define spc putchar(' ')
#define ent putchar('\n')
#define pr_ prt("---")
#define prx prt("***")
#define prtn (putchar('N') , putchar('o'))
#define prty (putchar('Y') , putchar('e') , putchar('s'))
using namespace std;
inline int read(){
int f = 1 , k = 0;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-') f = -1;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
k = (k << 3) + (k << 1) + (c ^ 48);
c = getchar() ;
}
return (f == 1 ? k : -k);
}
void output(int now){
if(now < 0){
putchar('-');
output(- now);
}
else{
if(now > 9) output(now / 10);
putchar((now % 10) ^ 48);
}
}
const int maxn = 1e2 + 1 ;
const int INF = 1e9 ;
int f[maxn][maxn] , n , d[maxn];
char s[maxn] ;
int Min(int a , int b) { return a < b ? a : b ;}
bool Check(int L , int R , int len) {
if((R - L + 1) % len) return false ;
for(int i=1 ; i<=len ; i++) {
for(int j=L ; j<=R ; j+=len) if(s[L + i - 1] != s[j + i - 1]) return false ;
}
return true ;
}
signed main(void) {
while((s[++ n] = getchar()) && (s[n] != ' ') && (s[n] != '\n')) {f[n][n] = 1 ;} n -= 1 ;
for(int i=1 ; i<=n ; i++) for(int j=1 ; j<=n ; j++) f[i][j] = f[i][j] ? f[i][j] : INF ;
// for(int i=1 ; i<=n ; i++) output(f[i][i]) , ent ;
for(int len=1 ; len<=n ; len++) {
for(int l=1 ; l<=n-len+1 ; l++) {
int r = l + len - 1 ;
for(int pos=l ; pos<=r ; pos++) {
f[l][r] = Min(f[l][r] , f[l][pos] + f[pos + 1][r]) ;
if(Check(l , r , pos - l + 1) == true) f[l][r] = Min(f[l][r] , f[l][pos] + log10(len / (pos - l + 1)) + 3) ;
}
}
}
return output(f[1][n]) , ent , 0 ;
}
/*
考虑区间DP
对于 f_i_j 表示 i ~ j 最短长度
考虑枚举断点取最小
对于字符串的判断直接暴力比较
*/
这份代码能过样例但是只得到了 0 分的高分,然后我看 WA 的原因时发现每个输出都多一我就将答案 −1 就AC了,但是样例就过不了了,所以这题的数据?!