JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子
Description
眾所周知,小 naive 有 n 個瓶子,它們在桌子上排成一排。第 i 個瓶子的顏色為 ci,每個瓶子都有靈性,每次操作可以選擇兩個相鄰的瓶子,消耗他們顏色的數值乘積的代價將其中一個瓶子的顏色變成另一個瓶子的顏色。
現在 naive 要讓所以瓶子的顏色都一樣,操作次數不限,但要使得操作的總代價最小。
Input
輸入文件為 colour.in。
一個測試點內多組數據。
第一行,一個正整數 T,表示數據組數。
每組數據內:
第一行一個整數 n,為瓶子的個數。
第二行共 n 個整數,第 i 個整數為第 i 個瓶子的顏色 ci。
Output
輸入文件為 colour.out。
共一行,一個整數,為最小的總代價。
Sample Input
4
7 4 6 10
Sample Output
92
樣例解釋
{7 4 6 10}? > {4 4 6 10}? > {4 4 4 10}? > {4 4 4 4}。
總代價為 7 × 4 + 4 × 6 + 4 × 10 = 92。
Data Constraint
1 ≤ T ≤ 10。
對于測試點內的每組數據:
Solution
-
懶得多想的我這題的做法十分差勁,時空復雜度均為 O(n3)O(n^3)O(n3) 。
-
設 f[i][j][k]f[i][j][k]f[i][j][k] 表示區間 [i,j][i,j][i,j] 被染成顏色 kkk(離散化)所需的最小代價。
-
轉移的話沒有必要一段一段的轉移,我們只需將一個狀態往外擴展一位即可。
-
枚舉時區間長度要從小到大枚舉,這樣狀態轉移就會不重不漏。
-
關于轉移的話,將可能會染的兩種顏色都分別轉移即可。
Code
#include<cstdio> #include<cstring> #include<cctype> using namespace std; typedef long long LL; const int N=305,M=1e5+5; const LL inf=3e18; int c[N],bz[M],v[N]; LL f[N][N][N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline LL min(LL x,LL y) {return x<y?x:y; } int main() {freopen("colour.in","r",stdin);freopen("colour.out","w",stdout);int T=read();while(T--){int n=read(),num=0;memset(bz,0,sizeof(bz));memset(f,60,sizeof(f));for(int i=1;i<=n;i++){c[i]=read();if(!bz[c[i]]){bz[c[i]]=++num;v[num]=c[i];}f[i][i][bz[c[i]]]=0;}for(int l=0;l<n;l++)for(int i=1,j=i+l;j<=n;i++,j++)for(int k=1;k<=num;k++)if(f[i][j][k]<inf){if(i>1){if(c[i-1]==v[k]) f[i-1][j][k]=min(f[i-1][j][k],f[i][j][k]); else{f[i-1][j][k]=min(f[i-1][j][k],f[i][j][k]+(LL)c[i-1]*v[k]);f[i-1][j][bz[c[i-1]]]=min(f[i-1][j][bz[c[i-1]]],f[i][j][k]+(LL)c[i-1]*(j-i+1)*v[k]);}}if(j<n){if(c[j+1]==v[k]) f[i][j+1][k]=min(f[i][j+1][k],f[i][j][k]); else{f[i][j+1][k]=min(f[i][j+1][k],f[i][j][k]+(LL)c[j+1]*v[k]);f[i][j+1][bz[c[j+1]]]=min(f[i][j+1][bz[c[j+1]]],f[i][j][k]+(LL)c[j+1]*(j-i+1)*v[k]);}}}LL ans=inf;for(int i=1;i<=num;i++) ans=min(ans,f[1][n][i]);printf("%lld\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5926. 【NOIP2018
- 下一篇: JZOJ 5930. 【NOIP2018