求助: 前缀和相关 P5520 青原樱
  • 板块灌水区
  • 楼主hakurei__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/3 20:20
  • 上次更新2023/10/23 16:44:14
查看原帖
求助: 前缀和相关 P5520 青原樱
338402
hakurei__楼主2023/5/3 20:20

这是道数学题

但楼主尝试写了下这题的动态规划 在前缀和部分遇到了bug

以下是 40pts 的dp

#include<iostream>
#include <cstring>
using namespace std ;
#define int long long
int mod;
int n,m,fac[503],f[5008][500];
 // f[i][j] =max{f[k][j-1]+1 } j<i-1
 
 void sov(){
 	
 	f[0][0]=1;
 	for(int i=1;i<=n;i++) f[1][i]=f[0][i]=1;

 	for(int i=1;i<=m;i++){
	 	 for(int j=i;j<=n;j++)
	 	 for(int k=0;k<j-1;k++)
 			f[i][j]+=f[i-1][k],f[i][j]%=mod;
 	}	
 	cout<< (f[m][n]* fac[m])%mod <<endl;
 }
 signed main(){
 	int i,ty; 
 	cin>>ty>>n>>m>>mod;
 	
 	fac[0]=1;
 	for(i=1;i<=500;i++) fac[i]=fac[i-1]*i,fac[i]%=mod;
 	
 	sov();
 }
 
 以下是有问题的前缀和优化
 ```cpp
#include<iostream>
#include <cstring>
using namespace std ;
#define int long long
int mod;
int n,m,fac[2002],f[2002][2002],s[2002][2002];
 // f[i][j] =max{f[k][j-1]+1 } j<i-1
 
 void solve(){
 	int i,j;
 	s[0][0]=f[0][0]=1;
 	for(i=1;i<=n;i++){
 		f[1][i]=f[0][i]=1;
 		s[1][i]=s[1][i-1]+f[1][i];
 		s[0][i]=s[0][i-1]+f[0][i];
 	}
	
 	for(i=1;i<=m;i++)
	 	 for(j=i;j<=n;j++){
	 	 	if(j>=2) f[i][j]=s[i-1][j-2] ;
	 	 	
 			s[i][j]=s[i][j-1]+f[i][j],s[i][j]%=mod ;
	 	 }
	 
 	cout<< (f[m][n]* fac[m])%mod <<endl;
 }
 signed main(){
 	int i,ty; 
 	cin>>ty>>n>>m>>mod;
 	
 	fac[0]=1;
 	for(i=1;i<=2000;i++) fac[i]=fac[i-1]*i,fac[i]%=mod;
 	
 	solve();
 }
 
 有没有大佬帮忙看看这个前缀和哪里写错了
 感谢orz
 

2023/5/3 20:20
加载中...