[POJ1717][luogu1282]Dominoes(多米诺骨牌)(dp)

来源:互联网 发布:什么叫网络 编辑:程序博客网 时间:2024/06/15 22:06

题目:

我是超链接

题解:

恩题目中有两个限制:1、上下差值最小 2、操作数最小
那设计状态f[i][j]前i个骨牌上下差值为j的最小操作数
类似一个背包,你可以选择翻/不翻,翻的话+1,最后按照绝对值取值就ok

代码:

#include <cstdio>#include <cstring>#include <iostream>#define N 1005#define INF 1e9using 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;}}