有多菜就不用说了,我是真的不会做,真的不是教育场坑的原因。
C. Good Subarrays
给一个数组 (A) , $A_i in [0,9] $ , 求区间和等于区间长度的区间个数
想到了是不是尺取,但是如果全一的数据显然不能。
又想到了 (dp)
想到了,我真菜
$A_i = A_i - 1 $ , 则转化为区间和为 (0) , 就变成了之前有多少个前缀和与目前相等
... 我好菜
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int x,sum = 0;
long long ans = 0;
map<int,int>P;P[0]++;
for(int i = 1;i <= n;i++){
scanf("%1d",&x);
sum += x-1;
ans += P[sum];
P[sum]++;
}
printf("%lld
",ans);
}
D. Colored Rectangles
有若干对三种颜色的木棍,给出他们的长度,选取不同颜色的两对木棍行成矩形,求最大的面积之和。
最先开始想的是直接贪心,但是碰到如下数据就不能贪心
7 8
9
10
如果贪心搞 9 和 10 的话,就浪费了第一种颜色的两对
后来又搞了dfs暴力,稳妥妥的 t 了。
然后搞了个记忆化,结果脑子有点迷糊。
好像是一个三维dp...
我吐了,跟昨天写的记忆化搜索差不多,稍微改一下就过了
/* Author: coding_like_cxk
* Time: 2020-08-15 10:35:01
**/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a, b, c;
int A[220], B[220], C[220];
int dp[220][220][220];
int ans;
int dfs(int x, int y, int z) {
int cnt = 0;
if (dp[x][y][z] != 0)return dp[x][y][z];
if (x > 0)cnt++; if (y > 0)cnt++; if (z > 0)cnt++;
if (cnt < 2) {
return dp[x][y][z] = 0;
}
int ans = 0;
if (x > 0 && y > 0) {
ans = max(ans, dfs(x - 1, y - 1, z) + A[x] * B[y]);
}
if (x > 0 && z > 0) {
ans = max(ans, dfs(x - 1, y, z - 1) + A[x] * C[z]);
}
if (y > 0 && z > 0) {
ans = max(ans, dfs(x, y - 1, z - 1) + B[y] * C[z]);
}
return dp[x][y][z] = ans;
}
int main() {
cin >> a >> b >> c;
for (int i = 1; i <= a; i++)cin >> A[i];
for (int i = 1; i <= b; i++)cin >> B[i];
for (int i = 1; i <= c; i++)cin >> C[i];
sort(A + 1, A + a + 1); sort(B + 1, B + b + 1); sort(C + 1, C + c + 1);
cout << dfs(a, b, c) << endl;
}