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. git - 简明指南(转)

    安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹,打开,然后执行  git init 以创建新的 git 仓库. 检出仓库 执行 ...

  2. C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

    STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...

  3. python2.7和 python3.4但是不要

    很多 Python 刚開始学习的人想知道他们应该从 Python 的哪个版本号開始学习.对于这个问题我的答案是 "你学习你喜欢的教程的版本号.然后检查他们之间的不同. " 可是假设 ...

  4. Lucene40PostingWriter

    控制freq和prox这两个文件的输出,比较简单. 默认skip interval这是16,max skip level这是10. 由源或使用可见VInt编码(而不是速度的传奇PForDelta). ...

  5. Nyoj 虚拟的城市之旅(bfs)

    描述   展馆是未来城市的缩影,个人体验和互动是不变的主题.在A国展馆通过多维模式和高科技手段,引领参观者在展示空间踏上一段虚拟的城市之旅. 梦幻国有N个城市和M条道路,每条道路连接某两个城市.任意两 ...

  6. Lake Counting (DFS)

    N*M的园子,雨后积起了水.八连通的积水背认为是连接在一起的.请求出园子里总共有多少水洼? dfs(Depth-First  Search)  八个方向的简单搜索.... 深度优先搜索从最开始的状态出 ...

  7. 用grunt搭建自动化的web前端开发环境

    用grunt搭建自动化的web前端开发环境 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发 ...

  8. Cocos2d-x 3.0final 终结者系列教程14-L新abel-Cocos2d-x公文

    目 录 新文本标签类Label 其它文本标签 字体制作工具使用介绍 小结 https://github.com/chukong/cocos-docs/blob/master/manual/framew ...

  9. View Component

    View Component 在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能. ...

  10. HDU - 1394 Minimum Inversion Number (线段树求逆序数)

    Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs ( ...