题目:
题解:
恩题目中有两个限制:1、上下差值最小 2、操作数最小
那设计状态f[i][j]前i个骨牌上下差值为j的最小操作数
类似一个背包,你可以选择翻/不翻,翻的话+1,最后按照绝对值取值就ok
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 1005
#define INF 1e9
using namespace std;
const int base=5000;
int f[N][N*10],x[N],y[N];
int main()
{
int n,i,j;
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
memset(f,0x7f,sizeof(f));
f[0][base]=0;
for (i=1;i<=n;i++)
for (j=-5000;j<=5000;j++)
f[i][j+base]=min(f[i-1][j+x[i]-y[i]+base]+1,f[i-1][j+y[i]-x[i]+base]);
for (i=0;i<=5000;i++)
if (min(f[n][i+5000],f[n][5000-i])<INF)
{printf("%d",min(f[n][i+5000],f[n][5000-i])); return 0;}
}
本文介绍了一种使用动态规划解决骨牌问题的方法。通过定义状态 f[i][j] 表示前 i 个骨牌上下差值为 j 的最小操作数,实现了对骨牌进行翻转操作以达到最小化上下差值的目标。该算法适用于求解具有特定约束条件的最优化问题。
1783

被折叠的 条评论
为什么被折叠?



