【Uva 10118】Free Candies
【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的更多相关文章
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【Uva 11584】Partitioning by Palindromes
[Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...
- 【Uva 11400】Lighting System Design
[Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...
随机推荐
- JavaScript中的Array对象方法调用
方法concat for 循环与for in 循环 <html> <head> <script type="text/javascript"> ...
- Canvas中的非零围绕规则原理
非零围绕规则:对于路径中指定范围区域,从该区域内部画一条足够长的线段.使此线段的全然落在路径范围之外. 非零围绕规则计数器:然后,将计数器初始化为0,每当这个线段与路径上的直线或曲线相交时,就改变计数 ...
- 使用React Hook后的一些体会
一.前言 距离React Hook发布已经有一段时间了,笔者在之前也一直在等待机会来尝试一下Hook,这个尝试不是像文档中介绍的可以先在已有项目中的小组件和新组件上尝试,而是尝试用Hook的方式构建整 ...
- WebView Js注入
注入前: 注入后: 主界面: package com.example.webviewjsdemo; import android.os.Bundle; import android.app.Activ ...
- [-] Failed to load plugin from /usr/share/metasploit-framework/plugins/db_autopwn: No classes were loaded from /usr/share/metasploit-framework/plugins/db_autopwn in the Msf::Plugin namespace.
问题详情 然后,执行,出现如下问题,则说明大家的这个文件,下载不是完整的或者你上传不完整. msf > load db_autopwn [-] Failed to load plugin fro ...
- ZoomIt(投影演示辅助软件)下载、安装与运行使用
下载ZoomIt后,打开即可使用:打开时,你讲看到如下的几个页面,这几个页面是为了介绍每个功能的使用,还可以去设定你觉得比较舒服的快捷键, 默认的是Ctrl+1屏幕放大.Ctrl+2屏幕标注,Ctrl ...
- js确认框confirm()用法实例详解
先为大家介绍javascript确认框的三种使用方法,具体内容如下 第一种方法:挺好用的,确认以后才能打开下载地址页面.原理也比较清晰.主要用于删除单条信息确认. ? 1 2 3 4 5 6 7 8 ...
- linux上编译好的php添加memcache扩展
cd /usr/local/src/ src>wget http://memcached.org/files/memcached-1.4.35.tar.gz src>tar ...
- GIL解释锁及进程池和线程池
官方介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...
- Xshell查看日志的基础使用
2018\11\26 下载安装不多说,官网免费版即可,附上链接:https://www.netsarang.com/products/xsh_overview.html 打开后新建连接,输入主机ip即 ...