CodeForces - 1509C The Sports Festival(dp)
題目鏈接:點(diǎn)擊查看
題目大意:給出一個長度為 nnn 的數(shù)列,現(xiàn)在需要對其進(jìn)行重排列,使得貢獻(xiàn)之和最小
對于一個排列的貢獻(xiàn)來說,對于每個 iii ,則 di=max(a1,a2,...,ai)?min(a1,a2,...,ai)d_i=max(a_1,a_2,...,a_i)-min(a_1,a_2,...,a_i)di?=max(a1?,a2?,...,ai?)?min(a1?,a2?,...,ai?)
題目分析:貪了一晚上,然后被很良心的 test3 一直卡掉,第二天看了看題解發(fā)現(xiàn)就是個很經(jīng)典的dp問題,雖然一開始也著手想過dp,但實(shí)在是推不出來方程
現(xiàn)將原數(shù)列排序,顯然選擇長度為 iii 的前綴一定是選擇排列好的數(shù)組中,選擇一段長度為 iii 的子數(shù)組,所以對區(qū)間開始dp,dpl,rdp_{l,r}dpl,r? 代表區(qū)間 [l,r][l,r][l,r] 中的數(shù)被選擇后的貢獻(xiàn)之和,轉(zhuǎn)移的話顯然加入一個數(shù)后的貢獻(xiàn)為 ar?aia_r-a_iar??ai?,來源就是 dpi+1,jdp_{i+1,j}dpi+1,j? 和 dpi,j?1dp_{i,j-1}dpi,j?1? 了
代碼:
// Problem: C. The Sports Festival // Contest: Codeforces - Codeforces Round #715 (Div. 2) // URL: https://codeforces.com/contest/1509/problem/C // Memory Limit: 256 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=2e3+100; int a[N]; LL dp[N][N]; int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;read(n);for(int i=1;i<=n;i++) {read(a[i]);}memset(dp,inf,sizeof(dp));for(int i=1;i<=n;i++) {dp[i][i]=0;}sort(a+1,a+1+n);for(int len=2;len<=n;len++) {for(int i=1;i+len-1<=n;i++) {int l=i,r=i+len-1;dp[l][r]=a[r]-a[l]+min(dp[l+1][r],dp[l][r-1]);}}cout<<dp[1][n]<<endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1509C The Sports Festival(dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1525D A
- 下一篇: CodeForces - 1527E P