[DP 의사 결정 단조로운 분할] Codeforces 868F.Yet Another Minimization Problem
그럼fi,k=min{fj,k+cost(j+1,i)} 이 물건은 이전에 CF833B처럼 라인 트리로 유지할 수 있는 방법이 너무 보고 싶어요.
그러나cost()=∑ai∗(ai-3-1)2로 인해 이 물건은 선단수로 유지하기 어려워 이렇게 할 수 없다
그러나 g(i)=fi, k와 h(i)=cost(i, j)라는 두 함수는 철 함수이기 때문에 결정이 단조로울 가능성이 높다.
그럼 대대적으로 분치할 수 있어.
그리고 분치할 때 코스트()라는 걸 처리해야 해.
가령 이전된 구간이 [L, R]이고 이전된 구간이 [l, r]라고 가정한다면 우리는 다음 층으로 돌아가기 전에 [L, l-3] 의cost()를 처리해야 복잡도를 확보할 수 있다.
O(nklogn)
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=100010;
int n,k,tms,a[N];
ll f[25][N];
int b[N],t[N];
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void rea(int &x){
char c=nc(); x=0;
for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}
void solve(int l,int r,int L,int R,int K,ll cur){
if(L>R) return ;
int mid=L+R>>1,p;
for(int i=L;i<=mid;i++) cur+=b[a[i]]++;
for(int i=l;i<=r && i<=mid;i++){
cur-=--b[a[i]];
if(f[K-1][i]+cur1][i]+cur,p=i;
}
for(int i=L;i<=mid;i++) cur-=--b[a[i]];
for(int i=l;i<=r && i<=mid;i++) cur+=b[a[i]]++;
solve(l,p,L,mid-1,K,cur);
for(int i=l;ifor(int i=L;i<=mid;i++) cur+=b[a[i]]++;
solve(p,r,mid+1,R,K,cur);
for(int i=l;i
for(int i=L;i<=mid;i++) b[a[i]]--;
}
int main(){
rea(n); rea(k);
for(int i=1;i<=n;i++) rea(a[i]);
ll cur=0;
for(int i=1;i<=n;i++){
cur+=b[a[i]]++;
f[1][i]=cur;
}
for(int i=2;i<=k;i++)
for(int j=1;j<=n;j++) f[i][j]=1LL<<60;
for(int i=2;i<=k;i++){
for(int j=1;j<=n;j++) b[j]=0;
solve(1,n,1,n,i,0);
}
cout<return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ]11048(python)python 풀이 DP를 이용해 풀이 보통 이런 문제는 dfs나 bfs로 풀이하는 것이여서 고민을 했는데 이 문구 덕분에 DP 를 이용해 풀이할 수 있었다 뒤로 돌아가는 등의 경우를 고려하지 않아도 되기 때문이다 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.