hdu 6156 Palindrome Function(数位dp&&其他)

来源:互联网 发布:linux 客户端工具 编辑:程序博客网 时间:2024/06/06 03:29

我的数位dp加上输入输出外挂还是超时了,罪过罪过。不过对于我理解数位dp 还是有帮助的

#include<bits/stdc++.h>using namespace std;typedef long long  ll;int bit[38],temp[38];ll dp[38][38][38];   int p;   int Scan(){   //  输入外挂    int res = 0, flag = 0;    char ch;    if ((ch = getchar()) == '-')    {        flag = 1;    }    else if(ch >= '0' && ch <= '9')    {        res = ch - '0';    }    while ((ch = getchar()) >= '0' && ch <= '9')    {        res = res * 10 + (ch - '0');    }    return flag ? -res : res;}void Out(int a){   //  输出外挂    if (a < 0)    {        putchar('-');        a = -a;    }    if (a >= 10)    {       Out(a / 10);    }    putchar(a % 10 + '0');}ll dfs(int len,int pos,int st,int lim)//st判断是否一直为0,lim为上界{  if(lim==0&&dp[p][len][pos]!=-1&&!st)return dp[p][len][pos];  if(pos<0)  {      return 1;  }  int num=lim?bit[pos]:p-1;  ll ans=0;  for(int i=0;i<=num;i++)  {      temp[i]=i;      if(st)        ans+=dfs(len-(st&&i==0),pos-1,i==0,lim&&i==num);        else        {            if((pos<(len+1)/2 && i==temp[len-pos]) || pos>=(len+1)/2)                ans+=dfs(len,pos-1,0,lim&&i==num);        }  }  if(!lim&&!st)dp[p][len][pos]=ans;    return ans;}ll solve(int x){    int len=0;    while(x)    {        bit[len++]=x%10;        x/=10;    }    return dfs(len-1,len-1,1,1);}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);   int t,cas=1;   ll ans;   scanf("%d",&t);   while(t--)   {    int l,r,x,y;l=Scan();r=Scan();x=Scan();y=Scan();    ans=0;    memset(dp,-1,sizeof(dp));    for(int i=x;i<=y;i++)    {        p=i;        ans+=(solve(r)-solve(l-1))*(i-1);    }    printf("Case #%d: ", cas++);    Out(ans+(ll)(r-l+1)*(y-x+1));    puts("");   }    return 0;}



原创粉丝点击