UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp)
题目大意:给你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)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
- Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)
Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...
随机推荐
- C++,Python,Go对照学习-01
好吧其实学Go只是为了好玩,只是为了好玩,学习过程中不免会把其他我懂的语言的思维定势和习惯带进来,由此有了这篇对照学习的记录,就当是留下学习的脚印吧. 这里所提及的语言特性在C++指最新的C++11标 ...
- hibernate Java 时间和日期类型 Hibernate 制图
基础知识: 于 Java 于, 型表示的时间和日期包含: java.util.Date 和 java.util.Calendar. 外, 在 JDBC API 中还提供了 3 个扩展了 java.ut ...
- Git是个好工具(转)
Git是分布式版本控制系统,我们常用的版本控制工具还有SVN.这里就得区分下什么是分布式版本控制系统,什么是集中化的版本控制系统. 集中化的版本控制系统 集中化的版本控制系统( Centralized ...
- Windows 8 – Reason 442: Failed to enable Virtual Adapter
Cisco VPN on Windows 8.1 – Reason 442: Failed to enable Virtual Adapter https://supertekboy.com/2013 ...
- web开发性能优化---UI接口章
1.尽可能的远div+css设计 DIV+CSS与表相比格优势布局: a.精简代码 采用DIV+CSS设计,页面代码精简.这是为了XHTML了解都知道. 代码精简所带来的直接优点有两点:一是提高蜘蛛爬 ...
- 【UVA】11137-Ingenuous Cubrency
DP问题,须要打表. dp[i][j]代表利用大小不超过i的数字组成j的方法. 状态方程是 dp[i][j] = d[i - 1][j] + sum{dp[i - 1][j - k * i * i * ...
- tortoise svn无法识别subversion check向下代码来解决
使用eclipse小工具subversion check代码后,tortoise svnclient(版本号1.8.8)无法识别,不显示svn图标. 根据每个试验后的线上不实际的解决方案.试过的方法: ...
- Git联系oschina托管代码版本号
工作一般使用SVN,近期好像GitHub有些火.看到开源中国上也有Git的开源版本号管理. 另外看到一篇文章说Git 比 SVN 要好. 就想多了解一下Git.顺便也能够把自己平时的一些代码保存在云端 ...
- 两种计算和输出n内5要么9除尽互惠
#include<stdio.h> int main() { int i=0,n=0; float fSum=0; scanf("%d", &n); for ( ...
- Swift中文教程(六)--枚举和结构
原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). enu ...