题目描述
在平面内有一些矩形,它们的两条边都平行于坐标轴。
我们称一个点被某个矩形覆盖,是指这个点在矩形的内部或者边界上。
请问,被奇数个矩形覆盖和被偶数(>2)个矩形覆盖的点的面积分别是多少?
输入
输入的第一行包含一个整数n,表示矩形的个数。
接下来n行描述这些矩形,其中第i行包含四个整数li,bi,ri,ti,表示矩形的两个对角坐标分别为(1i,bi)(ri,ti)。
输出
输出两行。
第一行包含一个整数,表示被奇数个矩形覆盖的点的面积。
第二行包含一个整数,表示被偶数(>2)个矩形覆盖的点的面积。
样例输入
3 1 1 3 3 2 2 4 4 3 3 5 5
样例输出
8 2
解题思路
将要放入背包的东西划分好,然后直接套用背包问题的模板
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
string s1,s2;
string s11[N],s22[N];
int dp[N][N];
int main(){
cin>>s1;
cin>>s2;
int l11=0,l22=0;
//接下来划分一下字符串
for(int i=0;s1[i];i++){
if(s1[i]>='A'&&s1[i]<='Z')l11++;
s11[l11]+=s1[i];
}
for(int i=0;s2[i];i++){
if(s2[i]>='A'&&s2[i]<='Z')l22++;
s22[l22]+=s2[i];
}
//OK,这次动态规划要比较的东西我们已经划分好了
//接下来是愉快的套模板了
for(int i=1;i<=l11;i++){
for(int j=1;j<=l22;j++){
dp[i][j]=dp[i-1][j];
if(s11[i]==s22[j])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
else
dp[i][j]=max(dp[i][j],dp[i][j-1]);
}
}
cout<<dp[l11][l22];
}