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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp

發布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

文章目錄

  • 題意:
  • 思路:

題意:

給定一個序列aaa,每次拿出來任意一個數(注意每次選的數不同),讓后定義max=max(a1,a2,...,ai)max=max(a_1,a_2,...,a_i)max=max(a1?,a2?,...,ai?)min=min(a1,a2,...,ai)min=min(a_1,a_2,...,a_i)min=min(a1?,a2?,...,ai?)di=max?mind_i=max-mindi?=max?min,求min(d1+d2+,...,+dn)min(d_1+d_2+,...,+d_n)min(d1?+d2?+,...,+dn?)

思路:

考慮將aaa數組排序,我們發現排序之后只剩一個區間合并的問題了,即轉換成將一個數添加到一個區間,且這個數一定與這個區間是相鄰的,花費就是a[r]?a[l]a[r]-a[l]a[r]?a[l]。說到這里很明顯就是個去區間dpdpdp了,定義f[l][r]f[l][r]f[l][r][l,r][l,r][l,r]的最小花費,考慮怎么擴展區間長度,比較容易想到如下轉移方程:f[l][r]=min(f[l][r],min(f[l][r?1],f[l+1][r])+a[r]?a[l])f[l][r]=min(f[l][r],min(f[l][r-1],f[l+1][r])+a[r]-a[l])f[l][r]=min(f[l][r],min(f[l][r?1],f[l+1][r])+a[r]?a[l])
不可能從中間轉移,因為從中間合并兩個長度的區間一定不優于從兩頭轉移來的,所以不需要枚舉[l,r][l,r][l,r]轉移,復雜度為O(N2)O(N^2)O(N2)

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid (tr[u].l+tr[u].r>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=2010,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n; LL f[N][N],a[N];int main() { // ios::sync_with_stdio(false); // cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int len=2;len<=n;len++)for(int l=1;l<=n-len+1;l++){int r=l+len-1;f[l][r]=1000000000000000;}sort(a+1,a+1+n);for(int len=2;len<=n;len++)for(int l=1;l<=n-len+1;l++){int r=l+len-1;f[l][r]=min(f[l][r],min(f[l+1][r],f[l][r-1])+a[r]-a[l]);}printf("%lld\n",f[1][n]);return 0; } /**/

總結

以上是生活随笔為你收集整理的Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp的全部內容,希望文章能夠幫你解決所遇到的問題。

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