打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Balanced Number 数位dp

题意:  给出求ab之间有多少个平衡数   4139为平衡数   以3为轴   1*1 4*2==9*1 

 

思路很好想但是一直wa  :

注意要减去前导零的情况 0 00 000 0000   不能反复计算

#include<bits/stdc  .h>using namespace std;//input by bxd#define rep(i,a,b) for(int i=(a);i<=(b);i  )#define repp(i,a,b) for(int i=(a);i>=(b);--i)#define RI(n) scanf("%d",&(n))#define RII(n,m) scanf("%d%d",&n,&m)#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)#define RS(s) scanf("%s",s);#define ll long long#define REP(i,N)  for(int i=0;i<(N);i  )#define CLR(A,v)  memset(A,v,sizeof A)//////////////////////////////////#define inf 0x3f3f3f3f#define N 3700 5#define MID N/2ll dp[20][20][N];ll a[20];ll dfs(int pos,int t,int state,bool lead,bool limit  ){    if(!pos)return state==0;    if(!limit&&!lead&&dp[pos][t][state MID]!=-1)return dp[pos][t][state MID];    ll ans=0;    int up=limit?a[pos]:9;    rep(i,0,up)    {        ans =dfs(pos-1,t,state i*(pos-t), lead&&i==0,limit&&i==a[pos]);    }    if(!limit&&!lead)dp[pos][t][state MID]=ans;    return ans;}ll solve(ll x){    int pos=0;    ll ans=0;    while(x)    {        a[  pos]=x;        x/=10;    }    rep(i,1,pos)    ans =dfs(pos,i,0,true,true);    return ans-pos 1;//去除前导零}int main(){    int cas;    CLR(dp,-1);    RI(cas);    while(cas--)    {        ll a,b;        cin>>a>>b;        printf("%lld\n",solve(b)-solve(a-1));    }    return 0;}
View Code

 

或者

#include<bits/stdc  .h>using namespace std;//input by bxd#define rep(i,a,b) for(int i=(a);i<=(b);i  )#define repp(i,a,b) for(int i=(a);i>=(b);--i)#define RI(n) scanf("%d",&(n))#define RII(n,m) scanf("%d%d",&n,&m)#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)#define RS(s) scanf("%s",s);#define ll long long#define REP(i,N)  for(int i=0;i<(N);i  )#define CLR(A,v)  memset(A,v,sizeof A)//////////////////////////////////#define inf 0x3f3f3f3f#define N 3700 5#define MID N/2ll dp[20][20][N];ll a[20];ll dfs(int pos,int t,int state,bool lead,bool limit  ){    if(!pos)return !lead&&state==0;    if(!limit&&!lead&&dp[pos][t][state MID]!=-1)return dp[pos][t][state MID];    ll ans=0;    int up=limit?a[pos]:9;    rep(i,0,up)    {        ans =dfs(pos-1,t,state i*(pos-t), lead&&i==0,limit&&i==a[pos]);    }    if(!limit&&!lead)dp[pos][t][state MID]=ans;    return ans;}ll solve(ll x){    if(x<0)return 0;    if(x==0)return 1;    int pos=0;    ll ans=0;    while(x)    {        a[  pos]=x;        x/=10;    }    rep(i,1,pos)    ans =dfs(pos,i,0,true,true);    return ans 1;//去除前导零}int main(){    int cas;    CLR(dp,-1);    RI(cas);    while(cas--)    {        ll a,b;        cin>>a>>b;        printf("%lld\n",solve(b)-solve(a-1));    }    return 0;}
View Code

 

来源:http://www.icode9.com/content-4-165851.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
飞花如梦,阳光灿烂的日子
Floyd 最短路径
仙人掌相关问题的解法(1)-DFS树解决仙人掌DP问题,圆方树
图的深度优先搜索dfs
运筹学教学|动态规划例题分析(一)
NOIP 2016 Day 1 题解 | Sengxian's Blog
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服