【Link】:

【Description】



有4堆书;

每本书编号从1..20

每堆书都是N本;

然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里;

你的口袋最多容纳5本书;

当你的口袋里有两本一样的书的时候,那一对书就归你了;

但是一旦你的口袋装满了,就不能再装书了;游戏停止

问你最多能拿多少对书。

【Solution】



比较明显的动规了;

每次只能从4堆书的堆顶中选择一本书

定义f[i][j][k][l]表示第一堆书上有i本数,第二堆书。。。。获得的最大书对数;

则从某一堆书上拿一本书;

相当于某一维变量的值减去1;

写个前缀和,记录最初始每一堆书的第j本书上面1..20这些书各有多少本

转移的时候,就能根据这个前缀和,获取之前拿了哪些书了;

成对的消掉,增加数目,不能成对的,则记录书的类型;

对于拿的书的类型<5的状态做转移就好;



【NumberOf WA】



0



【Reviw】

【Code】

#include <bits/stdc++.h>
using namespace std; const int N = 40;
const int INF = 0x3f3f3f3f; int n,x[5][N+10],f[N+5][N+5][N+5][N+5],pre[5][N+10][21];
int temp[22]; pair<int,int> tongji(int a,int b,int c,int d){
memset(temp,0,sizeof temp);
for (int i = 1;i <= 20;i++){
temp[i] += pre[1][a][i];
temp[i] += pre[2][b][i];
temp[i] += pre[3][c][i];
temp[i] += pre[4][d][i];
}
int num = 0,num1 = 0;
for (int i = 1;i <= 20;i++){
num+=temp[i]/2;
temp[i]%=2;
num1+=temp[i];
}
return make_pair(num1,num);
} int main(){
//freopen("F:\\rush.txt","r",stdin);
while (~scanf("%d",&n) && n){
for (int i = n;i >= 1;i--)
for (int j = 1;j <= 4;j++)
scanf("%d",&x[j][i]); for (int i = 1;i <= 4;i++){
for (int k = 1;k <= 20;k++) pre[i][n+1][k] = 0;
for (int j = n;j >= 1;j--){
for (int k = 1;k <= 20;k++)
pre[i][j][k] = pre[i][j+1][k];
pre[i][j][x[i][j]]++;
}
} memset(f,-INF,sizeof f);
f[n][n][n][n] = 0;
int ans = 0;
pair <int,int> pii;
for (int i = n;i >= 0;i--)
for (int j = n;j >= 0;j--)
for (int k = n;k >= 0;k--)
for (int l = n;l >= 0;l--)
if (f[i][j][k][l]>=0){
ans = max(ans,f[i][j][k][l]);
if (i){
pii = tongji(i,j+1,k+1,l+1);
if (pii.first<5){
int &t = f[i-1][j][k][l];
t = max(t,pii.second);
}
}
if (j){
pii = tongji(i+1,j,k+1,l+1);
if (pii.first<5){
int &t = f[i][j-1][k][l];
t = max(t,pii.second);
}
}
if (k){
pii = tongji(i+1,j+1,k,l+1);
if (pii.first<5){
int &t = f[i][j][k-1][l];
t = max(t,pii.second);
}
}
if (l){
pii = tongji(i+1,j+1,k+1,l);
if (pii.first<5){
int &t = f[i][j][k][l-1];
t = max(t,pii.second);
}
}
}
printf("%d\n",ans);
}
return 0;
}

【Uva 10118】Free Candies的更多相关文章

  1. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  2. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  3. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  4. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 【uva 1025】A Spy in the Metro

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

  9. 【Uva 11400】Lighting System Design

    [Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...

随机推荐

  1. Python: PS 滤镜--碎片特效

    本文用 Python 实现 PS 滤镜中的碎片特效,这个特效简单来说就是将图像在 上,下,左,右 四个方向做平移,然后将四个方向的平移的图像叠加起来做平均.具体的效果图可以参考之前的博客 http:/ ...

  2. BZOJ 4448 主席树+树链剖分(在线)

    为什么题解都是离线的-- (抄都没法抄) 搞一棵主席树 1 操作 新树上的当前节点设成1 2 操作 查max(i-xx-1,0)那棵树上这条路径上有多少个点是1 让你找经过了多少个点 查的时候用dee ...

  3. RecordAccumulator 1

    介绍 前面讲过producer会将数据保存在RecordAccumulator中,并通过Sender发送数据.RecordAccumulator 就相当于一个队列保存着那些准备发送到server的数据 ...

  4. 用@property (copy) NSMutableArray *array;会有什么问题?

    我们县回忆一下copy属性的作用,一个属性标记了copy,当你调用他的setter方法,他会建立一个索引计数为1的对象,然后释放旧对象. @property (copy) NSMutableArray ...

  5. Windows Server 2012 r2 显示计算机图标

    在 Windows Server 2012 R2 系统中,微软取消了服务器桌面个性化选项,如何重新调出配置界面,在桌面上显示计算机图标,本文为大家介绍一下! Win2012我的电脑怎么显示到桌面? 一 ...

  6. Linux 下安装 redis 详情

    一:将redis 压缩包上传到 Linux  usr/local下 (一):在local 下创建一个 redis 目录 (二):上传redis压缩包到此目录下. 二:Linux 进入 local目录下 ...

  7. 【Educational Codeforces Round 37 F】SUM and REPLACE

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...

  8. Java基础学习总结(17)——线程

    一.线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程. 程只是一个静态的概念,机器上的一个.class文件,机器上的一个.exe ...

  9. MySQL日志设置及查看方法

    MySQL有以下几种日志: 错误日志: -log-err 查询日志: -log 慢查询日志: -log-slow-queries 更新日志: -log-update 二进制日志: -log-bin 默 ...

  10. ArcGIS api for javascript——地图配置-增加标注到滑动器

    描述 ArcGISTiledMapServiceLayer,这意味着图层有一个在明确的比例的预先渲染的地图切片的cache.能够从tileInfo属性获得图层的的缓存比例数组.这是本例中标注如何被得到 ...