娘加载较慢请耐心等待qwq~~~看板

[2022编思1062]找出最少动作数

[2022编思1062]找出最少动作数

题面

有一个栈,这个栈有m个状态,每个状态记为Si每个状态里面有n种数字,数字iai个。
考虑从全空,依次经历S1...Sm,让操作数最小化。

sov

是一个神奇的区间DP。
考虑对于某个区间Si...Sj,从开始塞进去不用动的数字有Ci,j个,这个区间要进行fi,j次操作,转移可以是:
fi,j=min(fi,j,fi,k+fk+1,j2Ci,j)
结束

code

#include<stdio.h>
#include<string.h>
#define min(a, b) (a > b ? b : a)
#define MAXN 105
int a[MAXN][MAXN];
int c[MAXN][MAXN];
int f[MAXN][MAXN];
int n, m;
int main()
{
	scanf("%d %d", &m, &n);
	for(int i = 1; i <= m; ++i)
	{
		for(int j = 1; j <= n; ++j)
		{
			scanf("%d", &a[i][j]);
		}
	}
	for(int i = 1; i <= m; ++i)
	{
		int mi;
		for(int k = 1; k <= n; ++k)
		{
			mi = 0x3f3f3f3f;
			for(int j = i; j <= m; ++j)
			{
				mi = min(a[j][k], mi);
				c[i][j] += mi;
			}
		}
	}
	memset(f, 0x3f, sizeof(f));
	for(int i = 1; i <= m; ++i) f[i][i] = 2 * c[i][i];
	for(int len = 1; len <= m; ++len)
	{
		for(int l = 1; l + len - 1 <= m; ++l)
		{
			int r = l + len - 1;
			for(int k = l; k <= r; ++k)
			{
				f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] - 2 * c[l][r]);
			}
		}
	}
	printf("%d", f[1][m]);
}
posted @   椎名·六花  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示