abc370E
作者:
Air1222
,
2024-10-07 21:18:04
,
所有人可见
,
阅读 2
//题目描述:给定长度为n的序列,要求出分割为不存在连续区间和为k的总方案数
//如果没有限制条件和为k,总分割dp求解形式,可以用前缀和优化
#include <iostream>
using namespace std;
const int N = 110;
int f[N];
int main()
{
int n;
cin>>n;
f[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=i-1;j>=1;j--)
f[i]+=f[j];
f[i]++;
}
cout<<f[n];
return 0;
}
//优化写法
#include <iostream>
using namespace std;
const int N = 110;
int f[N];
int main()
{
int n;
cin>>n;
f[1]=1;
int sum=1;
for(int i=2;i<=n;i++)
{
f[i]=sum+1;
sum+=f[i];
}
cout<<f[n];
return 0;
}
//本题朴素dp
#include <iostream>
using namespace std;
const int N = 2e5+10,MOD = 998244353;
int f[N];
int s[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]+=s[i-1];
}
f[0]=1;//不分割
for(int i=1;i<=n;i++)
for(int j=i;j>=1;j--)
if(s[i]-s[j-1]!=k)
f[i]+=f[j-1];
cout<<f[n];
return 0;
}
#include <iostream>
#include <map>
using namespace std;
const int N = 2e5+10,MOD = 998244353;
typedef long long LL;
int f[N];//f[i],前i个总划分方式
LL s[N];
map<LL,LL>m;
int main()
{
LL n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]+=s[i-1];
}
LL sum=1;//注意初始值
m[0]=1;//不划分
for(int i=1;i<=n;i++)
{
f[i]=(sum-m[s[i]-k])%MOD;
sum+=f[i];
m[s[i]]+=f[i];
}
cout<<f[n];
return 0;
}