日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 的瓶子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。