首页 > 代码库 > HDU 5106 Bits Problem (数位DP)
HDU 5106 Bits Problem (数位DP)
题目地址:HDU 5106
这个题要定义个dp结构体,dp[i][j].sum表示当前第i位还剩j个1的时候的和,dp[i][j].tot表示当前第i位还剩j个1的时候的符合要求的个数。不记录个数的话,当前位上的1无法跟着低位的出现而累加。
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=1e9+7; const int INF=0x3f3f3f3f; const double eqs=1e-9; char c[1100]; LL d[1100]; int len; struct node { LL sum, tot; }dp[1100][1100]; node dfs(int cnt, int one, int maxd, int zero) { node tmp, ans; if(cnt==-1){ tmp.tot=(!one&&maxd); tmp.sum=0; return tmp; } if(maxd&&zero&&dp[cnt][one].sum!=-1) return dp[cnt][one]; int i, r=maxd?1:c[len-cnt-1]-'0'; ans.sum=0;ans.tot=0; for(i=0;i<=r;i++){ if(one-i>=0){ tmp=dfs(cnt-1,one-i,maxd||i<r,zero||i); ans.sum+=(tmp.tot*d[cnt]*i+tmp.sum)%mod; ans.tot=(ans.tot+tmp.tot)%mod; } } if(maxd&&zero){ dp[cnt][one].sum=ans.sum; dp[cnt][one].tot=ans.tot; } return ans; } void init() { int i, j; for(i=0;i<=1000;i++){ for(j=0;j<=1000;j++){ dp[i][j].sum=-1; dp[i][j].tot=0; } } d[0]=1; for(i=1;i<=1000;i++){ d[i]=d[i-1]*2%mod; } } int main() { int n, i, j; init(); while(scanf("%d",&n)!=EOF){ scanf("%s",c); len=strlen(c); node ans=dfs(len-1,n,0,0); printf("%I64d\n",ans.sum%mod); } return 0; }
HDU 5106 Bits Problem (数位DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。