UVA 11361 - Investigating Div-Sum Property-数位DP
来源:互联网 发布:c语言初始化顺序表 编辑:程序博客网 时间:2024/05/29 13:17
转移方程很好写
开3维存储,dp[len][sum][Mul]
sum,mul代表取模的i~n位的各数字和,以及其代表的数对k取模的值
可知 sum最大为10*10,而mul可能很大,即最大可能是k,也就是10000,
mul开1w也不会超时,跑了500ms,但是实际可以测试发现,k超过100基本都是0了,因为 各位数和加起来能整除100的几乎只有10 10 10 10 10。。。了 那样大的数不会有几个的。。。所以也就是说,k最大取不到100,mul当然也开100足够了
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;typedef long long ll;const int maxn=100+5; int aa[12]; int dp[11][maxn][110];//int dp[11][maxn][10005];// pos = 当前处理的位置(一般从高位到低位)// pre = 上一个位的数字(更高的那一位)// status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回,// 给计数器+1。// limit = 是否受限,也即当前处理这位能否随便取值。如567,当前处理6这位,// 如果前面取的是4,则当前这位可以取0-9。如果前面取的5,那么当前// 这位就不能随便取,不然会超出这个数的范围,所以如果前面取5的// 话此时的limit=1,也就是说当前只可以取0-6。//// 用DP数组保存这2个状态是因为往后转移的时候会遇到很多重复的情况。//可根据需要增加维数,例如preint k;ll dfs(int pos,int sum,int flag,int mul){ ll ans=0; if (pos==0) //已结搜到尽头,返回"是否找到了答案"这个状态。 { if (sum%k==0&&mul%k==0) return 1; else return 0; } //DP里保存的是完整的,也即不受限的答案,所以如果满足的话,可以直接返回。 if (!flag &&dp[pos][sum][mul]!=-1) return dp[pos][sum][mul]; int up; if (flag) up=aa[pos]; else up=9; //根据是否受限确定枚举的上界 for (int i=0; i<=up; i++) { int ff; if (!flag) ff=0; else { if (i==up) ff=1; else ff=0; } ans +=dfs(pos-1,(sum+i)%k,ff,(mul*10+i)%k); } //DP里保存完整的、取到尽头的数据 if (!flag) dp[pos][sum][mul]=ans; return ans;}int main(){ int tt,cas=0; scanf("%d",&tt); int cnt=1; while (tt--) { memset(dp,-1,sizeof dp); int a,b; scanf("%d%d%d",&a,&b,&k); if (k>=100 ) {printf("0\n"); continue;;} int len=0; while(b) { aa[++len]=b%10; b/=10; } ll ans1=dfs(len,0,1,0); len=0; b=a-1; while(b) { aa[++len]=b%10; b/=10; } ll ans2=dfs(len,0,1,0); printf("%lld\n",ans1-ans2); }}
0 0
- UVa 11361 Investigating Div-Sum Property / 数位DP
- UVA 11361 - Investigating Div-Sum Property(数位DP)
- uva 11361 - Investigating Div-Sum Property(数位dp)
- UVa 11361 - Investigating Div-Sum Property (数位DP)
- UVA 11361 Investigating Div-Sum Property(数位DP)
- uva 11361 Investigating Div-Sum Property 数位dp
- uva 11361 Investigating Div-Sum Property 数位DP
- Uva 11361Investigating Div-Sum Property(数位DP)
- UVA 11361 - Investigating Div-Sum Property-数位DP
- UVa 11361 Investigating Div-Sum Property (数位DP)
- uva 11361 Investigating Div-Sum Property
- Investigating Div-Sum Property Uva 11361
- UVA - 11361 Investigating Div-Sum Property
- uva 11361 Investigating Div-Sum Property
- UVa 11361 Investigating Div-Sum Property
- uva 11361 Investigating Div-Sum Property
- UVA 11361Investigating Div-Sum Property
- UVa 11361Investigating Div-Sum Property
- Java中错误记录
- 【Linux网络编程】UDP编程
- 搭建storm集群
- 笔记:CXF与spring整合
- 面试前的思考
- UVA 11361 - Investigating Div-Sum Property-数位DP
- 基于verilog的EEPROM读写
- 唯品会订单分库分表的实践总结以及关键步骤
- 程序员-前行-001-c++程序
- X86 内存布局分析(Memory map)
- jap 复合查询
- oracle存储过程和存储函数(1)
- numpy入门2
- 多年之痒,终结于今日