Edu Round#93(div2)

有多菜就不用说了,我是真的不会做,真的不是教育场坑的原因。

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;
}

原文地址:https://www.cnblogs.com/sduwh/p/13507807.html