1079: [SCOI2008]着色方案
2024-09-03 01:41:11
思路
首先是dp,如果直接用每个种颜色的剩余个数做状态的话,复杂度为5^15。
由于c<=5,所以用剩余数量的颜色的种类数做状态:f[a][b][c][d][e][last]表示剩余数量为1的颜色种类数,为2,3,4,5的。
转移时,如果上一次使用的是为4的,这次如果转移使用3的话,为了使相邻的不相同,则需要-1
最后一个转移写错了个地方,一直re...
代码
#include<cstdio>
#include<algorithm>
#include<iostream> using namespace std;
typedef long long LL;
const LL mod = 1e9+;
const int N = ; LL f[N][N][N][N][N][];
int t[]; LL dfs(int a,int b,int c,int d,int e,int last) {
if ((a|b|c|d|e)==) return ;
if (f[a][b][c][d][e][last]) return f[a][b][c][d][e][last];
LL ans = ;
if (a) ans += dfs(a-,b,c,d,e,)*(a-(last==));
if (ans > mod) ans %= mod;
if (b) ans += dfs(a+,b-,c,d,e,)*(b-(last==));
if (ans > mod) ans %= mod;
if (c) ans += dfs(a,b+,c-,d,e,)*(c-(last==));
if (ans > mod) ans %= mod;
if (d) ans += dfs(a,b,c+,d-,e,)*(d-(last==));
if (ans > mod) ans %= mod;
if (e) ans += dfs(a,b,c,d+,e-,)*e; //-
if (ans > mod) ans %= mod;
f[a][b][c][d][e][last] = ans;
return ans;
} int main() {
int n;
cin >> n;
for (int a,i=; i<=n; ++i) {
cin >> a;
t[a] ++;
}
cout << dfs(t[],t[],t[],t[],t[],);
return ;
}
最新文章
- oracle增量备份
- android JSON解析之JSONObject与GSON
- ArcGIS三大文件格式解析
- iostat命令简单说说
- Weibo SSO认证 和初次请求数据
- ASP.net与SQLite数据库通过js和ashx交互(连接和操作)
- OpenVPN-ng,为移动续航的应用层隧道
- WPF动态加载3D ;放大-旋转-平移
- 《反project核心原则》说明
- MongoDB基本语法
- 将n个东西分成n1,n2,n3,n4,....nr 共 r组分给r个人有多少种分法。
- spark组件笔记
- mysql 之各种 join 之间的关系
- spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
- postman接口测试实例
- 圆桌的项目Alpha冲刺——测试
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
- 设置eclipse/myeclipse的智能提示
- launch edge 和 latch edge 延迟
- windows server 2003中用系统自带工具调整磁盘分区大小