纪中游记(六)
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 }
终
哇,原题是真的难受。