我hack我自己
查看原帖
我hack我自己
326254
LonginusMonkey楼主2024/8/8 22:56
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;
}
2024/8/8 22:56
加载中...