hdu 4433 天津赛饮恨的c题·····事后才想出来

20 篇文章 0 订阅
3 篇文章 0 订阅

这题状态的设计主要在于后效性的消除,每步操作最多影响后面两位 然后预处理(枚举)出转移

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<sstream>
#include<string>
#include<climits>
#include<stack>
#include<set>
#include<bitset>
#include<cmath>
#include<deque>
#include<map>
#include<queue>
#define iinf 0x7f7f7f7f
#define linf 1000000000000000000LL
#define dinf 1e200
#define eps 1e-11
#define all(v) (v).begin(),(v).end()
#define sz(x)  x.size()
#define pb push_back
#define mp make_pair
#define lng long long
#define sqr(a) ((a)*(a))
#define pii pair<int,int>
#define pll pair<lng,lng>
#define pss pair<string,string>
#define pdd pair<double,double>
#define X first
#define Y second
#define pi 3.14159265359
#define ff(i,xi,n) for(int i=xi;i<=(int)(n);++i)
#define ffd(i,xi,n) for(int i=xi;i>=(int)(n);--i)
#define ffl(i,r) for(int i=head[r];i!=-1;i=edge[i].next)
#define ffe(i,r) for(_edge *i=head[r];i;i=i->next)
#define cc(i,j) memset(i,j,sizeof(i))
#define two(x)          ((lng)1<<(x))
#define lson l , mid , rt << 1
#define rson mid + 1 , r , rt << 1 | 1
#define mod  1073741824
#define pmod(x,y) (x%y+y)%y
using namespace std;
typedef vector<int>  vi;
typedef vector<string>  vs;
template<class T> inline void checkmax(T &x,T y)
{
    if(x<y) x=y;
}
template<class T> inline void checkmin(T &x,T y)
{
    if(x>y) x=y;
}
template<class T> inline T Min(T x,T y)
{
    return (x>y?y:x);
}
template<class T> inline T Max(T x,T y)
{
    return (x<y?y:x);
}
template<class T> T Abs(T a)
{
    return a>0?a:(-a);
}
template<class T> inline T lowbit(T n)
{
    return (n^(n-1))&n;
}
template<class T> inline int countbit(T n)
{
    return (n==0)?0:(1+countbit(n&(n-1)));
}
int num[10][10][10];
int dp[1010][10][10];
char a[1010],b[1100];
int d[6][3]= {1,0,0,9,0,0,1,1,0,9,9,0,1,1,1,9,9,9};
int main()
{
    int c[6];
    cc(num,0x7f);
    for(c[0]=0; c[0]<=9; ++c[0])
        for(c[1]=0; c[1]<=9; ++c[1])
            for(c[2]=0; c[2]<=9; ++c[2])
                for(c[3]=0; c[3]<=9; ++c[3])
                    for(c[4]=0; c[4]<=9; ++c[4])
                        for(c[5]=0; c[5]<=9; ++c[5])
                        {
                            int ds[3]= {};
                            int nu=0;
                            ff(i,0,5)
                            {
                                ff(j,0,2)
                                {
                                    ds[j]+=c[i]*d[i][j];
                                }
                                nu+=c[i];
                            }
                            checkmin(num[ds[0]%10][ds[1]%10][ds[2]%10],nu);
                        }
    while(scanf("%s%s",a+1,b+1)==2)
    {
        int n=strlen(a+1);
        cc(dp,0x7f);
       dp[0][0][0]=0;
        ff(i,1,n)
        {
            int w=pmod(b[i]-a[i],10);
            ff(j,0,9)
            ff(k,0,9)
            {
                int ans=iinf;
                ff(ij,0,9)
                ff(ik,0,9)
                {
                    checkmin(ans,dp[i-1][ij][ik]+num[pmod(w-ij,10)][pmod(j-ik,10)][k]);
                }
                dp[i][j][k]=ans;
            }
        }
        int res=iinf;
        ff(i,0,9)
        ff(j,0,9)
        checkmin(res,dp[n][i][j]);
        printf("%d\n",res);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值