在线评测:
http://codevs.cn/problem/1068/
整体思路:
因为卡片只有1,2,3,4四种卡片,所以四维dp分别表示每种卡片用了多少张情况下所能得到的最大分数,dp即可
失误之处:
开始没有注意到每种卡片不超过40张的数据范围,误以为要开120*120*120*120,怎么算空间都不对
注意认真计算空间,不要一下数组开大10个点全炸
注意判断-1后为负值的数组越界情况
体会心得:
认真算空间!!
认真看数据范围!!
AC代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using
namespace
std;
int
n,m,sz[400],js[5],dp[50][50][50][50],tp;
int
main()
{
scanf
(
"%d%d"
,&n,&m);
for
(
int
i = 0;i < n;i++)
{
scanf
(
"%d"
,&sz[i]);
}
for
(
int
i = 1;i <= m;i++)
{
scanf
(
"%d"
,&tp);
js[tp]++;
}
for
(
int
yi = 0;yi <= js[1];yi++)
{
for
(
int
er = 0;er <= js[2];er++)
{
for
(
int
san = 0;san <= js[3];san++)
{
for
(
int
si = 0;si <= js[4];si++)
{
int
maxn = 0,tot = sz[yi + er * 2 + san * 3 + si * 4];
if
(yi >= 1) maxn = max(dp[yi-1][er][san][si] + tot,maxn);
if
(er >= 1) maxn = max(dp[yi][er-1][san][si] + tot,maxn);
if
(san >= 1) maxn = max(dp[yi][er][san-1][si] + tot,maxn);
if
(si >= 1) maxn = max(dp[yi][er][san][si-1] + tot,maxn);
dp[yi][er][san][si] = maxn;
}
}
}
}
printf
(
"%d\n"
,dp[js[1]][js[2]][js[3]][js[4]] + sz[0]);
return
0;
}
|