【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. [ACM] HDU 1400 Mondriaan&#39;s Dream (状态压缩,长2宽1长方形铺满)

    Mondriaan's Dream Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. Java基础学习(三) -- OOP的三大特征、向上和向下转型、内部类之详解

    面向对象编程(OOP)的三大特征 什么是封装? (1) 把对象的状态和行为看成一个统一的整体,将二者存放在一个独立的类中; (2) "信息隐藏", 把不需要让外界知道的信息隐藏起来 ...

  3. 记录一次Permission denied解决过程

    热烈推荐:超多IT资源,尽在798资源网 朋友网站碰到一个奇怪的问题,程序所在目录无法进行上传操作. 具体细节是这样的:网站所在目录 /www/web/xiangmua 路径下,/www/web 都可 ...

  4. yii2.0缓存篇之文件缓存

    文件缓存: 在 frontend/config/main.php/components数组下添加: 'cache'=>[      'class'=>'yii\caching\FileCa ...

  5. NodeJS学习笔记 进阶 (10)Nodejs 进阶:log4js入门实例(ok))

    个人总结:读完这篇文章讲解了log4js的使用,具体更多可以参考npmjs上看,读完这篇需要15分钟. 摘选自网络 对于线上项目用来说,日志是非常重要的一环.log4js是使用得比较多的一个日志组件, ...

  6. bzoj1612 Usaco08 Jan 牛大赛

    水题模拟 建一个图,每两个牛进行比赛就连一条边,然后两遍dfs求出比他弱和比他强的牛,最后如果相加数量等于n,说明他能与全部的牛进行比较,排名确定. #include<bits/stdc++.h ...

  7. poj2728 Desert King(最小生成树+01分数规划=最优比率生成树)

    题意 n个点完全图,每个边有两个权值,求分数规划要求的东西的最小值. (n<=1000) 题解 心态炸了. 堆优化primT了. 普通的就过了. 我再也不写prim了!!!! 咳咳 最优比率生成 ...

  8. 解读I/O多路复用技术

    前言 当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应.在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命 ...

  9. 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析

    云服务器 ECS Linux 系统可以使用通常自带的 dig 命令来查询域名解析情况.本文对此进行简要说明. 查询域名 A 记录 命令格式: dig <域名> 比如,查询域名 www.al ...

  10. ADL & 实参相依的查找 & 成员与非成员的查找

    也就是会根据实参,所处在的名字空间,来查找对应名字空间里面的函数. 对于<<也是常见的场景,会根据实际要打印出来的下一个操作数,来决定调用哪个命名空间里面的函数. 注意,不同命名空间里面的 ...