day 9

Frost_Delay

2019-08-09 15:18:32

Personal

四道SCOI2009原题,三道DP一道矩乘,我又不会,难受; 才87.5分; 8.11:终于把4道题都A了 T1[P4158 [SCOI2009]粉刷匠](https://www.luogu.org/problemnew/show/P4158) 改完AC了 处理f数组时k只需枚举到m,因为一块木板最多用m桶油漆XD ```cpp #include<iostream> #include<cstdio> using namespace std; int n,m,t,ans=-1; int sum[51][51][2]; int f[51][51][51]; int g[51][2501]; int main() { cin>>n>>m>>t; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { char c=getchar(); while(c!='0'&&c!='1')c=getchar(); sum[i][j][1]=sum[i][j-1][1]; sum[i][j][0]=sum[i][j-1][0]; sum[i][j][c-48]++; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=m;k++) for(int h=0;h<j;h++) { f[i][j][k]=max(f[i][j][k],f[i][h][k-1]+max(sum[i][j][1]-sum[i][h][1],sum[i][j][0]-sum[i][h][0])); } for(int i=1;i<=n;i++) for(int j=t;j>=1;j--) for(int k=1;k<=min(j,m);k++) { g[i][j]=max(g[i][j],g[i-1][j-k]+f[i][m][k]); } cout<<g[n][t]<<endl; return 0; } ``` T2[P4159 [SCOI2009]迷路](https://www.luogu.org/problemnew/show/P4159) ```cpp #include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int mod=2009; char c; ll n,t,rd; struct node{ ll a[101][101]; }ans,p; void X() { node tot; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) tot.a[i][j]=0; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) for(int k=1;k<=n*9;k++) tot.a[i][j]=(tot.a[i][j]+p.a[i][k]*p.a[k][j]%mod)%mod; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) p.a[i][j]=tot.a[i][j]; return; } void anss() { node tot; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) tot.a[i][j]=0; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) for(int k=1;k<=n*9;k++) tot.a[i][j]=(tot.a[i][j]+ans.a[i][k]*p.a[k][j]%mod)%mod; for(int i=1;i<=n*9;i++) for(int j=1;j<=n*9;j++) ans.a[i][j]=tot.a[i][j]; } int main() { cin>>n>>t; for(int i=1;i<=n;i++) for(int j=1;j<=8;j++) p.a[i*9-9+j][i*9-8+j]=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>c; rd=c^48; if(rd) p.a[i*9-9+rd][j*9-8]=1; } for(int i=1;i<=9*n;i++) ans.a[i][i]=1; while(t) { if(t&1) { anss(); t--; } X(); t>>=1; } cout<<ans.a[1][n*9-8]<<endl; return 0; } ``` T3[P4161 [SCOI2009]游戏](https://www.luogu.org/problemnew/show/P4161) ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int su[1000]={0,2},tmp,n,k=1; long long f[1010]; int main() { cin>>n; if(n==1) { cout<<"1"<<endl; return 0; } for(int i=3;i<=n;i+=2) { su[++k]=i; for(int j=2;j<k;j++) if(i%su[j]==0){ k--;break; } } f[0]=1; for(int i=1;i<=k;i++) for(int j=n;j>=su[i];j--) { tmp=su[i]; while(tmp<=j) { f[j]+=f[j-tmp]; tmp*=su[i]; } } long long ans=1; for(int i=1;i<=n;i++)ans+=f[i]; cout<<ans<<endl; return 0; } ``` T4[P2657 [SCOI2009]windy数](https://www.luogu.org/problemnew/show/P2657) ```cpp #include<iostream> #include<cstdio> #include<cmath> using namespace std; int f[20][20],a,b; int main() { cin>>a>>b; for(int i=0;i<=9;i++) f[1][i]=1; for(int i=2;i<=15;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) if(abs(j-k)>=2)f[i][j]+=f[i-1][k]; int s[15]={},cnt=0,tot=0,s1[15]={},cntt=0,tot1=0; while(a){ cnt++; s[cnt]=a%10; a/=10; } for(int i=1;i<cnt;i++) for(int j=1;j<=9;j++) tot+=f[i][j]; for(int i=1;i<s[cnt];i++)tot+=f[cnt][i]; for(int i=cnt-1;i>=1;i--) { for(int j=0;j<s[i];j++) { if(abs(s[i+1]-j)>=2)tot+=f[i][j]; } if(abs(s[i+1]-s[i])<2)break; } b++; while(b){ cntt++; s1[cntt]=b%10; b/=10; } for(int i=1;i<cntt;i++) for(int j=1;j<=9;j++) tot1+=f[i][j]; for(int i=1;i<s1[cntt];i++)tot1+=f[cntt][i]; for(int i=cntt-1;i>=1;i--) { for(int j=0;j<s1[i];j++) { if(abs(s1[i+1]-j)>=2)tot1+=f[i][j]; } if(abs(s1[i+1]-s1[i])<2)break; } cout<<tot1-tot<<endl; return 0; } ```