纪中游记(六)

20190809

T0

思考时间最长的一道题,没有调出来就很尴尬

其实就是一道虚假的区间DP+背包

区间DP:

设a[i][b][l]表示i行涂l个格子粉刷b次所能获取的最大正确格子数,那么就有:

a[i][b][l]=max(a[i][b][l],a[i][b-1][k]+max(ban[i][j]-ban[i][k],l-k+1-(ban[i][j]-ban[i][k]))

接下来是背包:

设f[i][b]表示涂到i行涂b次所能获取的最大正确格子数,也可推出:

f[i][b]=max(f[i][b],f[i-1][b-k]+a[i][k][m])

这样就成功了

(想看代码,不可能的)

思路不清晰,爆零两行泪

T3

这不是原题吗?看我……

我*,这个if应该怎么写?

(由于记忆这个不可靠的东西,HHHG直到考试结束也没有调出这道题)

 1 #include<bits/stdc++.h>//zxtql
 2 #define lll long long//you_xiaotql
 3 using namespace std;//
 4 long long a,b;
 5 int linex[15];
 6 long long f[15][25][2][2];
 7 lll dfs(int wei,int last,bool zero,bool line)
 8 {
 9     if(wei==0) return 1;
10     if(f[wei][last][zero][line]>=0) return f[wei][last][zero][line];
11     int maxx=9;long long num=0;
12     if(line==1)
13         maxx=linex[wei];
14     for(int i=0;i<=maxx;i++)
15     {
16         if(abs(last-i)<2&&zero==0) continue;
17         num+=dfs(wei-1,i,((zero==1)&&(i==0)),((line==1)&&(i==linex[wei]))),cout<<wei<<" "<<i<<" "<<endl;
18     }
19     f[wei][last][zero][line]=num;
20     return num;
21 }
22 lll s(long long x)
23 {
24     int num=0;
25     memset(f,-1,sizeof(f));
26     memset(linex,0,sizeof(linex));
27     while(x)
28     {
29         linex[++num]=x%10;
30         //cout<<linex[num]<<" "; 
31         x=x/10;
32     }
33     return dfs(num,20,1,1);
34 }
35 int main()
36 {
37     scanf("%lld%lld",&a,&b);
38     printf("%lld",s(b)-s(a-1));
39     return 0;
40 }
经ZXdalao指点后瞬间清晰的代码

哇,原题是真的难受。

 

posted @ 2019-08-13 21:53  HHHG  阅读(180)  评论(0编辑  收藏  举报