链接:https://ac.nowcoder.com/acm/contest/52244/E
来源:牛客网
题目描述
lbromine 对于完形填空简直一窍不通,但是这是英语考试的必考项目。幸好 lbromine 使用奇怪的占卜术得到了每道题目 A、B、C、DA、B、C、DA、B、C、D 是正确选项的概率,但是他的强迫症使得他完型填空时每个选项都会选总题目数的 141\over441 个。现在他想知道如果他按照每个选项都选总题目数的 141\over441 个,他选对题目数的最大期望是多少。
输入描述:
第一行一个正整数 nnn 表示这次完形填空有 nnn 道题。
接下来 nnn 行,每行四个整数 ai,bi,ci,dia_i,b_i,c_i,d_iai,bi,ci,di 表示第 iii 题 A、B、C、DA、B、C、DA、B、C、D 是正确选项的概率乘 100100100。
保证 ai+bi+ci+di=100a_i+b_i+c_i+d_i=100ai+bi+ci+di=100,且 nnn 是 444 的倍数。
输出描述:
输出一行一个整数表示 lbromine 选对题目数的最大期望乘 100100100 向下取整。
示例1
输入
4
10 20 30 40
40 30 20 10
10 40 20 30
30 10 40 20
输出
160
备注:
对于 30%30\%30% 的数据,n=4n=4n=4
对于 60%60\%60% 的数据,1≤n≤201\leq n\leq 201≤n≤20
对于 100%100\%100% 的数据,1≤n≤1001\leq n\leq 1001≤n≤100
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int f[30][30][30][30];
int main()
{
cin >> n;
int a,b,c,d;
for (int i = 1;i <= n;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
for (int j = 0;j <= min(i,n/4);j++)
{
for (int k = 0;k <= min(i,n/4);k++)
{
for (int p = 0;p <= min(i,n/4);p++)
{
for (int q = 0;q <= min(i,n/4);q++)
{
if (j + k + p + q != i - 1) continue;
f[j + 1][k][p][q] = max(f[j + 1][k][p][q],f[j][k][p][q] + a);
f[j][k + 1][p][q] = max(f[j][k + 1][p][q],f[j][k][p][q] + b);
f[j][k][p + 1][q] = max(f[j][k][p + 1][q],f[j][k][p][q] + c);
f[j][k][p][q + 1] = max(f[j][k][p][q + 1],f[j][k][p][q] + d);
}
}
}
}
}
cout << f[n/4][n/4][n/4][n/4];
return 0;
}