题解 小 a 和 uim 之大逃离
首先可以想到设状态 表示小 和小 分别表示他们目前取得的得分,那么最终的答案便是 的时候。
但是这样设置状态的复杂度无疑是高的。并且十分浪费,所以考虑设 表示 的值。那么 就是答案。
接着考虑如何处理任意起点出发,根据套路,可以设置一个超级原点,向每个点进行连边,跑 即可。
设 表示从超级原点到 ,差值为 ,且现在是 小/小 拿分,答案就是 。将超级原点设为 即可,为了使得第一步是小 取,我们将边界条件设为 。
由于两人得分要 ,所以我们将 转化为模意义下的即可。
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL read() { LL sum=0,flag=1; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();} while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();} return sum*flag; } const LL MOD=1e9+7; const int N=810; int n,m,k; int f[N][N][20][2],a[N][N]; int To(int x) { return (x%(k+1)+(k+1))%(k+1); } int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { a[i][j]=read(); } } f[0][0][0][1]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++){ for(int z=0;z<=k;z++) { f[i][j][z][1]=((f[i-1][j][To(z+a[i][j])][0]+f[i][j-1][To(z+a[i][j])][0])%MOD+f[0][0][To(z+a[i][j])][0])%MOD; f[i][j][z][0]=((f[i-1][j][To(z-a[i][j])][1]+f[i][j-1][To(z-a[i][j])][1])%MOD+f[0][0][To(z-a[i][j])][1])%MOD; } } } LL ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=(ans+f[i][j][0][1])%MOD; } } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效