#include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 100 + 5; int n, m, dp[N][N][N], sum[N][N], vis[N][N], ans, mod = 1e9 + 7; signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> m; for (int i = n; i >= 1; i--) for (int j = 1; j <= m; j++) { char c; cin >> c; vis[i][j] = vis[i][j - 1] + (c == 'X'); } dp[0][1][m] = 1; for (int l = 1; l <= n; l++) { memset(sum, 0, sizeof sum); for (int i = 1; i <= m; i++) for (int j = i; j <= m; j++) sum[i][j] = (sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + dp[l - 1][i][j] + mod) % mod; for (int len = 1; len <= m; len++) for (int i = 1; i + len - 1 <= m; i++) { int j = i + len - 1; if (!(vis[l][j] - vis[l][i - 1])) ans = (ans + (dp[l][i][j] = (sum[i][m] - sum[i][j - 1] + mod) % mod)) % mod; } } cout << (ans + 1) % mod; return0; }
#include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 100 + 5; int n, dp[N][N]; string s; boolcheck(int x, int y, int z) { for (int i = x; i <= y; i++) if (s[i] != s[x + ((i - x) % z)]) returnfalse; returntrue; } signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> s; n = s.size(); s = '#' + s; memset(dp, 0x3f, sizeof dp); for (int i = 1; i <= n; i++) dp[i][i] = 1; for (int len = 2; len <= n; len++) for (int i = 1; i + len - 1 <= n; i++) { int j = i + len - 1; dp[i][j] = len; for (int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]); if (!(len % (k - i + 1)) && check(i, j, k - i + 1)) dp[i][j] = min(dp[i][j], dp[i][k] + 2 + (int)to_string(len / (k - i + 1)).size()); } } cout << dp[1][n]; return0; }
/*此代码状态设计相反*/ #include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 50 + 5; int n, m, a[N], b[N], dp[N][N][1005], sum[N]; signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; for (int i = 1; i <= n; i++) for (int j = i + 1; j <= n; j++) if (a[i] == a[j]) sum[i] += b[j]; for (int i = 1; i <= n; i++) for (int j = 0; j <= sum[i]; j++) dp[i][i][j] = (b[i] + j) * (b[i] + j); for (int len = 2; len <= n; len++) for (int i = 1; i + len - 1 <= n; i++) { int j = i + len - 1; for (int k = 0; k <= sum[j]; k++) dp[i][j][k] = dp[i][j - 1][0] + (b[j] + k) * (b[j] + k); for (int k = i; k <= j - 2; k++) if (a[j] == a[k]) for (int l = 0; l <= sum[j]; l++) dp[i][j][l] = max(dp[i][j][l], dp[i][k][b[j] + l] + dp[k + 1][j - 1][0]); } cout << dp[1][n][0]; return0; }
#include<bits/stdc++.h> typedefint int32; #define int long long usingnamespace std; constint N = 50 + 5; int n, m, a[N], b[N], dp[N][N][1005], sum[N]; signedmain() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; for (int i = 1; i <= n; i++) for (int j = 1; j < i; j++) if (a[i] == a[j]) sum[i] += b[j]; for (int i = 1; i <= n; i++) for (int j = 0; j <= sum[i]; j++) dp[i][i][j] = (b[i] + j) * (b[i] + j); for (int len = 2; len <= n; len++) for (int i = 1; i + len - 1 <= n; i++) { int j = i + len - 1; for (int k = 0; k <= sum[i]; k++) dp[i][j][k] = dp[i + 1][j][0] + (b[i] + k) * (b[i] + k); for (int k = i + 1; k < j; k++) if (a[i] == a[k + 1]) for (int l = 0; l <= sum[i]; l++) dp[i][j][l] = max(dp[i][j][l], dp[i + 1][k][0] + dp[k + 1][j][b[i] + l]); } cout << dp[1][n][0]; return0; }