UVA11125 - Arrange Some Marbles(dp)

option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2066" target="_blank" style="">题目链接

题目大意:给你n种不同颜色的弹珠。然后给出每种颜色的弹珠的个数,如今要求你将这些弹珠排序,要求同样颜色的部分最多3个。然后同样颜色的弹珠称为一个组。那么每一个相邻的组要求长度不同。颜色也不同,然后首位的两组也要符合要求。

解题思路:这题之前是被n<3000给吓到了,后面dp还那么多状态,感觉复杂度不能过。后面看了题解才发现dp的时候会将全部的情况包含进去,所以仅仅要dp的数组的复杂度够即可了,和n没有关系。由于这题有给弹珠的数目,所以须要记录一下每种颜色的弹珠的剩余数目。那么就是8∗8∗8∗8.(能够用一个8进制的数来取代传4个參数)由于还要求相邻的颜色和长度不同。所以还要3∗4来存放上一次是什么颜色长度是多少。麻烦的是首尾怎么办。枚举出首的组那么相应的尾也就优点理了。所以再开3∗4将第一个的颜色和大小存储进去。这样复杂度就是8∗8∗8∗8∗144。注意:0的时候输出的是1.

为什么和n没有关系呢,由于题目变动的仅仅是颜色的数目和各个颜色的个数,而我们dp的时候是将会出现的四种颜色,会出现的全部个数都包含进去了。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 4500;
const int maxs = 5;
const int maxc = 5; int N, PS, PC;
int num[maxc];
int f[maxn][maxs][maxc][maxs][maxc]; int dp (int state, int s, int c) { int& ans = f[state][PS][PC][s][c];
if (ans != -1)
return ans; if (!state) {
if (PS != s && PC != c)
return ans = 1;
return ans = 0;
} int tmp[maxc];
int tS = state;
for (int i = N - 1; i >= 0; i--) { if (tS >= (1<<(3*i))) {
tmp[i] = tS/(1<<(3*i));
tS %= (1<<(3*i));
} else
tmp[i] = 0;
} ans = 0;
for (int i = 0; i < N; i++) {
if (i == c)
continue;
for (int j = 1; j <= min(3, tmp[i]); j++) {
if (j == s)
continue;
ans += dp(state - (j * (1<<(3*i))), j, i);
}
}
return ans;
} void solve () { scanf ("%d", &N);
for (int i = 0; i < N; i++)
scanf ("%d", &num[i]); int state = 0;
for (int i = 0; i < N; i++)
state += num[i] * (1<<(3*i)); int ans = 0;
if (state) {
for (int c = 0; c < N; c++)
for (int s = 1; s <= min(num[c], 3); s++) {
PS = s;
PC = c;
ans += dp(state - s * (1<<(3*c)), s, c);
}
} else
ans = 1;
printf ("%d\n", ans);
} int main () { int T;
scanf ("%d", &T);
memset (f, -1, sizeof(f)); while (T--) {
solve();
}
return 0;
}

UVA11125 - Arrange Some Marbles(dp)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  4. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  5. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  6. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  7. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  8. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

  9. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

随机推荐

  1. Linux 编程学习笔记----动笔makefile档

    Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...

  2. MVC 定义JsonpResult实现跨域请求

    MVC 定义JsonpResult实现跨域请求 1:原理 在js中,XMLHttpRequest是不能请求不同域的数据,但是script标签却可以,所以可以用script标签实现跨域请求.具体是定义一 ...

  3. MyEclipse中将项目导出jar包,以及转化成EXE文件

    1.对于项目如何导出jar文件,和生成exe,解答目录如下: 首先生成jar文件,单击项目名称CF-users(这是我的协同过滤项目文件名称)右击--->Export如下图: 单击下一步 Sel ...

  4. Oracle安装及使用入门

    新手Oracle安装及使用入门   一.安装Oracle Step1 下载oracle压缩包并解压到同一文件夹下面 Step2 双击setup.exe进行安装 Step3:进入如下界面配置: 邮箱可不 ...

  5. 两个div横向排列,顶端对齐的方式。

    1.左右两个div都设置为float:left,如果右边div没有设置宽度,右边div的宽度会根据div里的内容自动调整. <!DOCTYPE html PUBLIC "-//W3C/ ...

  6. Sql使用视图(简单的视图)适合入门-level

    创建以便从库更好的数据呼叫和一个数据库,以(例如,该209东东库转移205图书馆) 例:209图书馆有不同的库名:数据库(AIS20140417092531电影库)供应商表(t_Supplier ). ...

  7. CQRS(命令查询职责分离)和 EDA(事件驱动架构)

    转载CQRS(命令查询职责分离)和 EDA(事件驱动架构) 上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动 ...

  8. ThinkPHP 3.2 开放 cache注缓存,过滤非法字符

    打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...

  9. Java初认识--Java中的语法结构

    Java中的语法结构(程序流程控制) Java的语法结构有四种: 1.顺序结构. 顺序结构很简单,就是按顺序执行,输出就可以了. 2.判断结构. 判断结构的一个代表性的语句是if:if语句有三种格式体 ...

  10. SQL代理执行EXE可执行程序

    原文:SQL代理执行EXE可执行程序  1.如果没有启用xp_cmdshell安全配置是不可以使用的-- 启用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1 ...