问个问题
查看原帖
问个问题
895690
gghack_Nythix楼主2024/5/26 18:54

rt,赛时我只想打前五个点,结果#2#3过不去是什么鬼

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
string s;
int dp[2005][2005];
int getLIS(string x,string y){
	memset(dp,0,sizeof(dp));
	x = " " + x;
	y = " " + y;
	for(int i = 1;i < x.size();++i) {
		for(int j = 1;j < y.size();++j) {
			if(x[i] == y[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
			else dp[i][j] = max(dp[i - 1][j],dp[i][j - 1]);
		}
	}
	return dp[x.size() - 1][y.size() - 1];
}
string tostring(int x){
	if(!x) return "0";
	string a;
	while(x){
		a += (x % 10) + '0';
		x /= 10;
	}
	string b;
	for(int i = a.size() - 1;i >= 0;--i)b += a[i];
	return b;
}
int toint(string x){
	int ans = 0;
	for(int i = 0;i  < x.size();++i) ans = ans * 10 + (x[i] - '0');
	return ans;
} 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin >> T;
	while(T--){
		cin >> n >> s;
		if(n == 1) {
			if((s[0] - '0') & 1) cout << "No\n";
			else cout << "Yes\n";
		}
		else if(n == 3){
			for(int i = 1;i <= s.size();++i) {
				for(int j = 1;j <= s.size() - i;++j) {
					string a = s.substr(0,i),b = s.substr(i,j),c = s.substr(i + j,s.size() - i - j);
					int x = toint(a),y = toint(b),z = toint(c);
					int A1 = x + z - y,A2 = x + y - z,A3 = y + z - x;
					string ss = tostring(A1 / 2 + A2 / 2) + tostring(A2 / 2 + A3 / 2) + tostring(A3 / 2 + A1 / 2);
					if((A1 % 2 == 0 && A2 % 2 == 0 && A3 % 2 == 0) && getLIS(ss,s) == ss.size()){
						cout << "Yes\n";goto xz;
					}
				}
			}
			cout << "No\n";
			xz:;
		}
		else{
			if(s.size() < n || (s.size() == 1 && (s[0] - '0') % 2 == 1 )) cout << "No\n";
			else{
				int sum = 0;
				for(int i = 0;i < s.size();++i) sum += s[i] - '0';
				if(!sum) cout << "No\n";
				else cout << "Yes\n";
			}
		}
	}
}
2024/5/26 18:54
加载中...