【题解】[CQOI2008] 矩阵的个数

熊神仙的做法好难想到。。。

暴力转移是这样的: d p i , x , y = ∑ d p i − 1 , x − x 0 , y − y 0 ( x 0 + y 0 ≤ a i ) dp_{i,x,y}=∑dp_{i-1,x-x_0,y-y_0}(x_0+y_0\leq a_i) dpi,x,y=dpi1,xx0,yy0(x0+y0ai)

相当于要对一个等腰 rt 的区域求和。

观察到 d p i , x − 1 , y dp_{i,x-1,y} dpi,x1,y 的重叠部分:

请添加图片描述
d p i , x , y = d p i , x − 1 , y − l i n e ( x − 1 , y − m → x − m − 1 , y ) + l i n e ( x , y → x , y − m ) dp_{i,x,y}=dp_{i,x-1,y}-line(_{x-1,y-m}\to _{x-m-1,y})+line(_{x,y}\to_{x,y-m}) dpi,x,y=dpi,x1,yline(x1,ymxm1,y)+line(x,yx,ym)

#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e17; int n,m,s1,s2,s3,sum,a[205]; ll dp[205][205][205],sum1[205][205],sum2[205][205]; void Mod(ll &x,ll y) { x=(x+y)%mod; } ll Sum1(int x,int y,int x0) { if(y<0) x+=y,y=0; if(x>=0&&y>=0) { if(x0>=1&&x+y-x0+1<=s2) return sum1[x][y]-sum1[x0-1][x+y-x0+1]; return sum1[x][y]; } return 0; } ll Sum2(int x,int y,int y0) { if(x>=0&&y>=0) { if(y0>=1) return sum2[x][y]-sum2[x][y0-1]; return sum2[x][y]; } return 0; } int main() { // freopen("data.in","r",stdin); scanf("%d%d%d%d",&n,&s1,&s2,&s3); dp[0][0][0]=1; for(int i=0;i<=s1;i++) { for(int j=0;j<=s2;j++) { sum1[i][j]=((i>=1)?sum1[i-1][j+1]:0)+dp[0][i][j]; sum2[i][j]=((j>=1)?sum2[i][j-1]:0)+dp[0][i][j]; } } for(int i=1;i<=n;i++) { scanf("%d",&m),sum+=m; for(int x=0;x<=s1;x++) { for(int y=0;y<=s2;y++) { dp[i][x][y]=(((x>=1)?dp[i][x-1][y]:0)-Sum1(x-1,y-m,x-m-1)+Sum2(x,y,y-m))%mod; } } for(int x=0;x<=s1;x++) { for(int y=0;y<=s2;y++) { sum1[x][y]=(((x>=1)?sum1[x-1][y+1]:0)+dp[i][x][y])%mod; sum2[x][y]=(((y>=1)?sum2[x][y-1]:0)+dp[i][x][y])%mod; } } } if(sum!=s1+s2+s3) { printf("0"); } else { printf("%lld",(dp[n][s1][s2]+mod)%mod); } }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530169.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示