hdu 6578 Blank dp

本文介绍了一种使用动态规划解决特定涂色问题的方法。问题要求计算在一系列限制条件下,将一排格子涂上四种颜色的不同方案数。文章详细解释了如何通过状态压缩和条件检查来实现高效求解。

题意


n个格子排成一行,每个格子可以涂四种颜色。
给m个形如(l,r,x)的限制,表示l到r格子内恰好有x种颜色
问满足所有限制的涂色方法有多少种
n<=100,m<=100

做法


dp,设f[i,j,k,l]表示四种颜色分别在i、j、k、l出现了最后一次,由于四种颜色调换顺序其实是一样的所以我们可以钦定i<=j<=k<=l
向后转移的时候判断当前状态是否满足限制即可,注意滚动和清空数组的问题

代码


#include <stdio.h>
#include <string.h>
#include <algorithm>

#define rep(i,st,ed) for (register int i=st;i<=ed;++i)

const int MOD=998244353;

int f[2][105][105][105];
int p[105],u[105][105],v[105][105];

int read() {
	int x=0,v=1; char ch=getchar();
	for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):v,ch=getchar());
	for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
	return x*v;
}

bool check(int i,int j,int k,int l) {
	if (!i&&!j&&!k&&!l) return true;
	if ((i==j)&&(i)) return false;
	if ((k==j)&&(k)) return false;
	if ((k==l)&&(k)) return false;
	return true;
}

void upd(int &x,int v) {
	x+=v; (x>=MOD)?(x-=MOD):0;
}

int main(void) {
	for (int T=read();T--;) {
		int n=read(),m=read();
		rep(i,1,n) p[i]=0;
		rep(i,1,m) {
			int l=read(),r=read(),x=read();
			p[r]++;
			v[r][p[r]]=l;
			u[r][p[r]]=x;
		}
		rep(i,0,1) rep(j,0,i) rep(k,0,j) f[0][i][j][k]=f[1][i][j][k]=0;
		f[0][0][0][0]=1;
		rep(i,0,n) {
			rep(j,0,i) rep(k,0,j) rep(l,0,k) f[!(i&1)][j][k][l]=0;
			rep(j,0,i) rep(k,0,j) rep(l,0,k) {
				if (!check(i,j,k,l)) continue;
				bool flag=false;
				rep(tx,1,p[i]) {
					int xf=v[i][tx],xs=u[i][tx];
					int tmp=(n>=xf)+(j>=xf)+(k>=xf)+(l>=xf);
					if (tmp!=xs) {
						flag=true; break;
					}
				}
				if (flag) continue;
				int x=f[i&1][j][k][l];
				upd(f[!(i&1)][j][k][l],x);
				upd(f[!(i&1)][i][j][k],x);
				upd(f[!(i&1)][i][k][l],x);
				upd(f[!(i&1)][i][j][l],x);
			}
		}
		int ans=0;
		rep(j,0,n) rep(k,0,j) rep(l,0,k) {
			if (!check(n,j,k,l)) continue;
			bool flag=false;
			rep(tx,1,p[n]) {
				int xf=v[n][tx],xs=u[n][tx];
				int tmp=(n>=xf)+(j>=xf)+(k>=xf)+(l>=xf);
				if (tmp!=xs) {
					flag=true; break;
				}
			}
			if (flag) continue;
			upd(ans,f[n&1][j][k][l]);
		}
		printf("%d\n", ans);
	}
	return 0;
}
内容概要:本研究聚焦于绿电直连型电氢氨园区的优化运行,提出一种集成绿色电力直接供给、电解水制氢及氢气合成氨工艺的综合能源系统架构。通过建立包含风光发电、电解槽、氨合成反应器、储氢罐、电网交互及多类型负荷在内的系统模型,综合考虑绿电直供优先、能量梯级利用与多能互补原则,构建以系统综合运行成本最小化为目标的优化调度模型。研究采用Matlab与Python工具进行算法求解和仿真分析,利用实际气象与负荷数据完成案例验证,评估了不同运行策略下系统的经济性、可再生能源消纳能力与碳减排效益,为新型电氢氨一体化园区的规划与运行提供了理论依据和技术支撑。; 适合人群:具备一定电力系统、新能源或化工背景的研究生、科研人员及从事综合能源系统规划与优化工作的工程技术人员。; 使用场景及目标:①用于科研学习,理解电-氢-氨多能转换系统的建模与优化方法;②为工业园区的低碳化、智能化改造提供技术参考与决策支持;③作为开发类似综合能源管理系统的理论基础。; 阅读建议:此资源包含完整的模型代码、数据与论文,使用者应结合代码仔细研读论文中的模型构建部分,重点关注目标函数与约束条件的设计逻辑,并尝试修改参数进行仿真,以深入掌握优化算法在实际系统中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值