新的一周^w^

2.22

cf 628d Magic Numbers

自己的状态定义错了

应该是 dp[i][j][0] 前 i 位 有一位是小于的,dp[i][j][1] 前 i 位都是相同的

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7
 8 const int mod = 1e9+7;
 9 typedef long long LL;
10 const int maxn = 2005;
11 LL dp[maxn][maxn][2];
12 int m,d,n,f[maxn][maxn];
13 char s[maxn],p[maxn];
14
15 LL solve(char* t){
16     memset(dp,0,sizeof(dp));
17         int v = t[1]-'0';
18         for(int i = 1;i <= t[1]-'0';i++){
19             if(i == d) continue;
20             if(i == v) dp[1][v%m][1] += 1LL;
21             else dp[1][i%m][0] += 1LL;
22       //      printf("dp[1][%d][0] = %d dp[1][%d][1] = %d\n",i%2,dp[1][i%m][0],i%2,dp[1][i%m][1]);
23         }
24
25         for(int i = 2;i <= n;i++){
26             for(int j = 0;j < m;j++){
27                 if(i%2){
28                     for(int k = 0;k <= 9;k++){
29                         if(k == d) continue;
30                         dp[i][(j*10+k)%m][0] += dp[i-1][j][0];
31                         if(k == t[i]-'0') dp[i][(j*10+k)%m][1] += dp[i-1][j][1];
32                         if(k < t[i]-'0') dp[i][(j*10+k)%m][0] += dp[i-1][j][1];
33                     }
34                 }
35                 else{
36                     dp[i][(j*10+d)%m][0] += dp[i-1][j][0];
37                     if(d == t[i]-'0') dp[i][(j*10+d)%m][1] += dp[i-1][j][1];
38                     if(d < t[i]-'0') dp[i][(j*10+d)%m][0] += dp[i-1][j][1];
39                 }
40                 dp[i][j][0] %= mod;
41                 dp[i][j][1] %= mod;
42              //   printf(">_<dp[%d][%d][0] = %d  ",i,j,dp[i][j][0]);
43                // printf("dp[%d][%d][1] = %d\n",i,j,dp[i][j][0]);
44             }
45         }
46      //   printf("dp[%d][0][0] = %d",n,dp[n][0][0]);
47        // printf(" dp[%d][0][1] = %d\n",n,dp[n][0][1]);
48         return (dp[n][0][0]+dp[n][0][1])%mod;
49 }
50
51 int ok(char* s){
52     for(int i = 1;i <= n;i++){
53         if(i%2 == 1 && (s[i]-'0') == d) return 0;
54         if(i%2 == 0 && (s[i]-'0') != d) return 0;
55     }
56     LL res = 0;
57     for(int i = 1;i <= n;i++){
58         res = (res*10+(s[i]-'0'))%m;
59     }
60     if(res == 0) return 1;
61     return 0;
62 }
63
64 int main(){
65     while(scanf("%d %d",&m,&d) != EOF){
66         scanf("%s",s+1);
67         scanf("%s",p+1);
68         n = strlen(s+1);
69             LL l = solve(s);
70             LL r = solve(p);
71             LL ans = (r-l+mod)%mod;
72             if(ok(s)) ans++;
73             printf("%I64d\n",ans);
74     }
75     return 0;
76 }

View Code

cf 629 c Famil Door and Brackets

dp[i][j] 表示前i个平衡度为 j 的方案数

先不理解平衡度,就是 ( = 1, ) = -1 这样来算前缀和

然后后来不理解dp[i][j] 的转移

dp[i][j] += dp[i-1][j-1] 表示第i位是一个 (

dp[i][j] += dp[i-1][j+1]表示第i位是一个 )

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 typedef long long LL;
 8 const int mod = 1e9+7;
 9 const int maxn = 5e5+5;
10 char s[maxn];
11 LL dp[2005][2005];
12 int n,m;
13
14 void solve(){
15     int minn = 1e9+7,pre = 0;
16     for(int i = 1;i <= m;i++){
17         if(s[i] == '(') pre++;
18         else pre--;
19         minn = min(minn,pre);
20     }
21     LL ans = 0LL;
22     int st = 0;
23     if(minn < 0) st = -minn;
24     for(int i = 0;i <= n-m;i++){
25         for(int j = st;j <= i;j++){
26             if(pre+j > 2000) continue;
27             LL tmp = dp[i][j]*dp[n-m-i][pre+j]%mod;
28             ans += 1LL*tmp;
29             ans %= mod;
30         }
31     }
32     printf("%I64d\n",ans);
33 }
34
35 int main(){
36     memset(dp,0,sizeof(dp));
37     dp[0][0] = 1LL;
38     for(int i = 1;i <= 2000;i++){
39         for(int j = 0;j <= i;j++){
40             if(j > 0) dp[i][j] += dp[i-1][j-1];
41             if(j+1 <= i) dp[i][j] += dp[i-1][j+1];
42             dp[i][j] %= mod;
43         }
44     }
45
46    /* for(int i = 1;i <= 10;i++){
47         for(int j = 0;j <= i;j++) printf("dp[%d][%d] = %d\n",i,j,dp[i][j]);
48     }*/
49
50     while(scanf("%d %d",&n,&m) != EOF){
51         scanf("%s",s+1);
52         solve();
53     }
54     return 0;
55 }

View Code

2.23

HDU 2089

第一道数位dp ^w^

因为数组开大了t了好几次

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int n,m;
 8 int dp[15][15][2],d[1005];
 9
10 int dfs(int p,int pre,int flag){
11     if(p <= 0) return 1;
12     if(dp[p][pre][flag] != -1) return dp[p][pre][flag];
13     int res = 0,top = (flag == 1)?9:d[p];
14     for(int i = 0;i <= top;i++){
15        // printf(">_<p = %d pre = %d i = %d\n",p,pre,i);
16         if(i == 4||(pre == 6 && i == 2)) continue;
17         res += dfs(p-1,i,flag||i<d[p]);
18     }
19     return dp[p][pre][flag] = res;
20 }
21
22 int solve(int x){
23     memset(dp,-1,sizeof(dp));
24     int cnt = 0;
25     while(x){
26         d[++cnt] = x%10;
27         x = x/10;
28     }
29     int ans = dfs(cnt,0,0);
30     return ans;
31 }
32
33 int main(){
34     while(scanf("%d %d",&n,&m) != EOF){
35         if(n == 0 && m == 0) break;
36         if(n > m) swap(n,m);
37         printf("%d\n",solve(m)-solve(n-1));
38     }
39     return 0;
40 }

View Code

2.24

HDU 3555

统计区间含 49 的数

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 typedef __int64 LL;
 8 LL dp[55][55][3],n;
 9 int d[105];
10
11 LL dfs(int p,int s,int limit){
12     if(p <= 0) return s == 2;
13     if(dp[p][s][limit] != -1) return dp[p][s][limit];
14     int top = (limit == 1)?d[p]:9;
15     LL ans = 0LL;
16     for(int i = 0;i <= top;i++){
17         int ns = s;
18         if(s == 0 && i == 4) ns = 1;
19         if(s == 1 && i == 9) ns = 2;
20         if(s == 1 && i != 9) ns = 0;
21         if(s == 1 && i == 4) ns = 1;
22         ans += dfs(p-1,ns,limit && i == top);
23     }
24     return dp[p][s][limit] = ans;
25 }
26
27 void solve(){
28     memset(dp,-1,sizeof(dp));
29     int cnt = 0;
30     LL x = n;
31     while(x){
32         d[++cnt] = x%10;
33         x = x/10;
34     }
35     LL ans = dfs(cnt,0,1);
36     printf("%I64d\n",ans);
37 }
38
39 int main(){
40     int T;
41     scanf("%d",&T);
42     while(T--){
43         scanf("%I64d",&n);
44         solve();
45     }
46     return 0;
47 }

View Code

HDU 3652

含有 13的数,而且能够被13整除

再加一维表示余数

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int n,dp[55][55][15][5],d[105];
 8
 9 int dfs(int p,int s,int mod,int limit){
10     if(p <= 0) return s == 2 && mod == 0;
11     if(dp[p][s][mod][limit] != -1) return dp[p][s][mod][limit];
12     int top = (limit == 1)? d[p]:9;
13     int ans = 0;
14     for(int i = 0;i <= top;i++){
15         int ns = s;
16         if(s == 0 && i == 1) ns = 1;
17         if(s == 1 && i != 3) ns = 0;
18         if(s == 1 && i == 1) ns = 1;
19         if(s == 1 && i == 3) ns = 2;
20         ans += dfs(p-1,ns,(mod*10+i)%13,limit && i==top);
21     }
22     return dp[p][s][mod][limit] = ans;
23 }
24
25 void solve(){
26     memset(dp,-1,sizeof(dp));
27     int x = n,cnt = 0;
28     while(x){
29         d[++cnt] = x%10;
30         x = x/10;
31     }
32     int ans = dfs(cnt,0,0,1);
33     printf("%d\n",ans);
34 }
35
36 int main(){
37     while(scanf("%d",&n) != EOF){
38         solve();
39     }
40     return 0;
41 }

View Code

CodeForces 55D

统计区间内能够整除每一位上的数字上的数的个数

记录前 n 位的和,因为太大mod 上2520, 再记录前 n 位的lcm,记录这两个状态

本来这题写的时候,是把limit 作为dp[]的一维的 是像这样dp[位数][sum][lcm][limit]

但是每次要清空,会T

然后看题解说,可以重复利用dp[]的值,所以只需要清空一次

但是我这样写的就不对了

其实我还是不懂这篇里面对那个limit 的注释

http://blog.csdn.net/u012350533/article/details/12362105

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 typedef long long LL;
 8
 9 const int mod = 2520;
10 LL n,m;
11 LL dp[25][2525][55];
12 int d[55];
13 int b[5005],rb[5005];
14
15 int gcd(int x,int y){
16      return y?gcd(y,x%y):x;
17 }
18
19 int Lcm(int x,int y){
20     return x/gcd(x,y)*y;
21 }
22
23 LL dfs(int p,int sum,int lcm,int limit){
24     if(p <= 0) return sum%b[lcm] == 0;
25     if(!limit && dp[p][sum][lcm] != -1) return dp[p][sum][lcm];
26     int top = (limit == 1)?d[p]:9;
27     LL ans = 0;
28     for(int i = 0;i <= top;i++){
29         int y;
30         if(i) y = rb[Lcm(b[lcm],i)];
31         else y = lcm;
32        // printf("i = %d y = %d\n",i,y);
33         ans += dfs(p-1,(sum*10+i)%mod,y,limit && i == top);
34     }
35     if(!limit) return dp[p][sum][lcm] = ans;
36     return ans;
37 }
38
39 LL solve( LL x){
40     int cnt = 0;
41
42     while(x){
43         d[++cnt] = x%10;
44         x = x/10;
45     }
46     LL ans = dfs(cnt,0,1,1);
47  //   printf("%I64d\n",ans);
48     return ans;
49 }
50
51 int main(){
52     int T;
53     int cnt = 0;
54     for(int i = 1;i <= mod;i++){
55         if(mod  % i == 0){
56             b[++cnt] = i;
57             rb[i] = cnt;
58      //       printf("i = %d\n",i);
59         }
60     }
61     memset(dp,-1LL,sizeof(dp));
62     scanf("%d",&T);
63     while(T--){
64         scanf("%I64d %I64d",&n,&m);
65         LL xiao = solve(n-1);
66         LL da = solve(m);
67         printf("%I64d\n",da-xiao);
68     }
69     return 0;
70 }

View Code

2.25

cf 628f F - Bear and Fair Set

不会建图

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7
  8 const int maxn = 500005;
  9 const int INF = (1 << 30) - 1;
 10
 11 struct Edge{
 12     int v,next,c;
 13 }e[maxn];
 14
 15 struct node{
 16     int l,x;
 17 }a[maxn];
 18
 19 int cmp(node n1,node n2){
 20     return n1.l < n2.l;
 21 }
 22
 23 int st,ed,lev[maxn],first[maxn],now[maxn],ecnt;
 24 int n,m;
 25 int B,Q;
 26
 27 void init(int a,int b){
 28     st = a; ed = b;
 29     memset(first,-1,sizeof(first));
 30     ecnt = 0;
 31 }
 32
 33 void addedges(int u,int v,int c){
 34     e[ecnt].next = first[u];
 35     e[ecnt].v = v;
 36     e[ecnt].c = c;
 37     first[u] = ecnt++;
 38
 39     e[ecnt].next = first[v];
 40     e[ecnt].v = u;
 41     e[ecnt].c = 0;
 42     first[v] = ecnt++;
 43 }
 44
 45 bool bfs(){
 46     queue<int> q;
 47     while(!q.empty()) q.pop();
 48     q.push(st);
 49     memset(lev,-1,sizeof(lev));
 50     lev[st] = 0;
 51     while(!q.empty()){
 52         int x = q.front();q.pop();
 53         for(int i = first[x];~i;i = e[i].next){
 54             int v = e[i].v;
 55             if(lev[v] < 0 && e[i].c > 0){
 56                 lev[v] = lev[x] + 1;
 57                 q.push(v);
 58             }
 59         }
 60     }
 61     return lev[ed] != -1;
 62 }
 63
 64 int dfs(int p,int minf){
 65     if(p == ed || minf == 0) return minf;
 66     for(int &i = now[p];~i;i = e[i].next){
 67         int v = e[i].v;
 68         if(lev[v] == lev[p] + 1 && e[i].c > 0){
 69             int d = dfs(v,min(e[i].c,minf));
 70             if(d > 0){
 71                 e[i].c -= d;
 72                 e[i^1].c += d;
 73                 return d;
 74             }
 75         }
 76     }
 77     return 0;
 78 }
 79
 80 int dinic(){
 81     int max_flow = 0,p1;
 82     while(bfs()){
 83         memcpy(now,first,sizeof(first));
 84         while((p1 = dfs(st,INF)) > 0)
 85         max_flow += p1;
 86     }
 87     return max_flow;
 88 }
 89
 90 int main(){
 91     while(scanf("%d %d %d",&n,&B,&Q)!= EOF){
 92         init(0,Q+7);
 93         for(int i = 1;i <= Q;i++) scanf("%d %d",&a[i].l,&a[i].x);
 94         a[0].l = 0;a[0].x = 0;Q++;
 95         a[Q].l = B;a[Q].x = n;
 96         sort(a+1,a+Q+1,cmp);
 97         for(int i = 1;i <= 5;i++) addedges(st,i,n/5);
 98         for(int i = 1;i <= Q;i++){
 99             if(a[i].x < a[i-1].x || (a[i].x != a[i-1].x && a[i].l == a[i-1].l)){
100                // printf("i = %d\n",i);
101                 puts("unfair");
102                 return 0;
103             }
104             addedges(i+5,ed,a[i].x-a[i-1].x);
105             for(int j = 1;j <= 5;j++){
106                 int lb = a[i-1].l/5+(a[i-1].l%5 >= j);
107                 int ub = a[i].l/5+(a[i].l%5 >= j);
108                 addedges(j,i+5,ub-lb);
109             }
110         }
111         int flow = dinic();
112       // printf("flow = %d\n",flow);
113         if(flow == n) puts("fair");
114         else puts("unfair");
115     }
116     return 0;
117 }

View Code

2.26

滚去学校

2.27

在虚拟机里面装了个Ubuntu,不过好像装挫了T_T

好忧桑......

装了7次...

后来那个continue还是显示不出来.....

狗急跳墙于是用了tab键(是太蠢T_T)

想传张图纪念一下下,,不过发现传不了图T_T

2.28

cf 633c Spy Syndrome 2

不会做,看题解

不会字典树

话说是看的别人的代码

他的每一个字符串哈希了两次,用pair存的

自己试了一下哈希一次的

mod 1e9+7的时候,wa 25

mod 998244353的时候,wa 67

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7
 8 typedef long long LL;
 9 const int maxn = 1e5+5;
10 int dp[maxn],pre[maxn],n,m;
11 char s[maxn];
12 char str[maxn][1005];
13 int mod[2] = {998244353,1000000007};
14 int base[2] = {217,31};
15 LL now[2];
16 LL hehe[1005];
17
18 map<pair<LL,LL>,int> h;
19
20 void print(int x){
21     if(pre[x] == -1) return;
22     int len = strlen(str[pre[x]]);
23     print(x - len);
24     printf("%s ",str[pre[x]]);
25 }
26
27 int main(){
28     while(scanf("%d",&n) != EOF){
29         scanf("%s",s);
30         scanf("%d",&m);
31         h.clear();
32         for(int i =0;i < m;i++){
33             scanf("%s",str[i]);
34             memset(now,0,sizeof(now));
35             int len = strlen(str[i]);
36             for(int k = 0;k < 2;k++){
37                 for(int j = 0;j < len;j++){
38                     char c = str[i][j];
39                     if(c >= 'A' && c <= 'Z') c += 'a'-'A';
40                     now[k] = (now[k]*base[k]+c)%mod[k];
41                 }
42             }
43             h[make_pair(now[0],now[1])] = i;
44         }
45         memset(dp,0,sizeof(dp));
46         memset(pre,-1,sizeof(pre));
47         dp[0] = 1;
48         for(int i = 0;i < n;i++){
49             memset(now,0,sizeof(now));
50                 for(int j = i;j >= max(0,i-1000);j--){
51                     for(int k = 0;k < 2;k++)
52                     now[k] = (now[k]*base[k]+s[j])%mod[k];
53                     if(dp[j] && h.find(make_pair(now[0],now[1])) != h.end()){
54                     //   printf("i = %d j = %d\n",i,j);
55                         dp[i+1] = 1;
56                         pre[i+1] = h[make_pair(now[0],now[1])];
57                     }
58                 }
59         }
60         print(n);
61         printf("\n");
62     }
63     return 0;
64 }

View Code

转载于:https://www.cnblogs.com/wuyuewoniu/p/5206025.html

寒假第七周 2.22 --- 2.28相关推荐

  1. 周计划1[7.22~7.28]

    周计划1[7.22~7.28] [ ] 复习List 0~4 [ ] List 5~6 [ ] 每天70个百词斩单词 [ ] 每天早上读单词 [ ] 无课日两个小时专业视频 [ ] 课后整理笔记.复习 ...

  2. 2019年春季第七周 编程总结

    一.作业头内容 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 C语言作业评价标准 我在这个课程的目标是 加深和巩固对指针.数组和地址之间的关系的理解:能更准确和灵活的使用指针对数组中元 ...

  3. 转:《七周成为数据分析师》总结

    本文转自: https://blog.csdn.net/weixin_39722361/article/details/79522111 个人公众号:数据路 知乎:无小意. 百日计划第一周总结 1. ...

  4. 20145324 《信息安全系统设计基础》第七周学习总结

    20145324 <信息安全系统设计基础>第七周学习总结 教材学习内容总结 存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构 随机访问存储器(两类) 1.静态RAM SRA ...

  5. 2019春第七周作业

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 要求我们掌握指针,可以更好的运用它 我在这个课程的目标是  学懂C语言,会编程一些简单的小应用 这个作业在那个具体方面帮助我实现目标  这 ...

  6. 天善磨剑之作,七周成为数据分析师秦路主讲

    章节1: 如何七周成为数据分析师   课时1:为什么需要七周   课时2:七周应该怎么学 章节2: 第一周:数据分析思维   课时3:为什么思维重要   课时4:数据分析的三种核心思维(结构化)    ...

  7. 《七周数据分析师》总结

    <七周数据分析师>总结 第一周:数据分析思维 1.核心数据分析思维 结构化 公式化 业务化 2.数据分析思维七大技巧 象限法 多维法 假设法 指数法 80/20法则(帕累托法则) 对比法 ...

  8. 20159313网络攻击与防范第七周学习总结

    第七章Windows操作系统安全攻防总结 1.Windows操作系统的基本结构 分为运行于处理器特权模式的操作系统内核,以及运行在处理器非特权模式的用户空间代码.采用宏内核模式来进行构架,这使得任意的 ...

  9. “Hello World!“”团队第七周召开的第三次会议

    今天是我们团队"Hello World!"团队第七周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七. ...

  10. “Hello World!”团队第七周召开的第五次会议

    今天是我们团队"Hello World!"团队第七周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七. ...

最新文章

  1. 动态划分VLAN的方法中不包括(23)。【答案】C
  2. mysql 数据库 xtrabackup (完全备份恢复,恢复后重启失败总结)
  3. 谁是创业板的支柱?兼驳《上海证券报》
  4. Flex中你最应该知道的10点
  5. Centos7.0安装tensorflow
  6. GDCM:将文件封装在RawData中的测试程序
  7. 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
  8. 实时数仓入门训练营:Hologres性能调优实践
  9. CakePHP 中文手册
  10. 用html做简易计步器,HTML5 运动计步器
  11. PHP移动互联网开发(1)——环境搭建及配置
  12. 有关USGS下载landsat 8影像的方法
  13. HDL语言三种描述方式--结构化描述方式、数据流描述方式、行为级描述方式
  14. GOT-10k: A Large High-Diversity Benchmark forGeneric Object Tracking in the Wild(论文翻译)
  15. 学习记录3——PMSM数学建模——simulink内数学模型搭建以及仿真
  16. 驭势吴甘沙:我的根本利益|Xtecher人物特稿
  17. 当前的安全设置计算机面临风险,win7系统IE8提示“当前安全设置会使计算机有风险”的解决方法...
  18. mysql科学计数法问题
  19. GEO数据挖掘全流程分析
  20. will not use cuDNN kernels since it doesn‘t meet the criteria

热门文章

  1. 学习python3(一)
  2. TZOJ 4839 麦森数(模拟快速幂)
  3. pytest-Mark数据驱动
  4. 「HNOI 2015」实验比较
  5. MySQL基础实战篇
  6. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
  7. solr(六): 集群
  8. IDEA用maven创建springMVC项目和配置
  9. Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想
  10. Android File存储