https://www.acmicpc.net/problem/21757

 

21757번: 나누기

$N$개의 정수 수열 $A_1, A_2, \dots , A_N$이 주어진다. 수열을 각각이 연속된 네 부분으로 나누려고 한다. 단, 각 부분은 최소 하나의 수를 포함해야 한다. 또, 각 부분의 합은 모두 같아야 한다. 즉, 어

www.acmicpc.net

 

 

[난이도] Gold3
[유형] DP

[풀이]
나중에..

 

#include <cstdio>
#include <cstring>
using ll = long long;
using namespace std;
int N,sum[100001],base,cnt;
ll dp[5];
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++) {
int v;
scanf("%d",&v);
sum[i]=sum[i-1]+v;
if(sum[i]==0) cnt++;
}
if(sum[N]==0){
if(cnt<4) puts("0");
else printf("%lld",(ll)(cnt-1)*(cnt-2)*(cnt-3)/6);
return 0;
}
if(sum[N]%4){
puts("0");
return 0;
}
base=sum[N]/4;
dp[0]=1;
for(int i=1;i<N;i++){
if(sum[i]%base) continue;
int j=sum[i]/base;
if(j==0 || j>3) continue;
dp[j]+=dp[j-1];
}
printf("%lld",dp[3]);
}


https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold3/21757.cpp

+ Recent posts