C. The Sports Festival
生活随笔
收集整理的這篇文章主要介紹了
C. The Sports Festival
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C. The Sports Festival
題意:
n個數,依次將所有數加入到區間內,每次得到一個k,k等于當前區間的最大值減最小值,
求所有k的和的最小值
題解:
一開始就沒往dp那方面想,自己在dp這方面的理解還是欠缺
正解區間dp
區間[l,r]是由左右兩個小區間轉移得到的,分別是[l+1,r],[l,r-1]
所以不難得到:dp[l][r]=min(dp[l+1,r],dp[l,r-1])+S
S是擴大區間長度后增加的情況,增加的情況就是最大值減最小值(即a[r] - a[l])
但是l和r不能直接從1到n枚舉,因為我們說了區間[l.r]是由小區間推來的,沒求出小區間怎么求大區間,所以我們循環區間長度,然后枚舉左端點,右端點自然得到,這樣遞推式就是從小區間到大區間
代碼:
#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b) typedef long long ll; using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=2e3+9; ll a[maxn]; ll dp[maxn][maxn]; int main() {ll n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+1+n);/*先確定區間長度,然后依次枚舉左端點*/for(int len=2;len<=n;len++){for(int l=1;l+len-1<=n;l++){int r=l+len-1; dp[l][r]=min(dp[l+1][r],dp[l][r-1])+(a[r]-a[l]);}}cout<<dp[1][n];return 0; } /* dp[l][r]=min(dp[l+1][r],dp[l][r-1])+(a[r]-a[l]); */總結
以上是生活随笔為你收集整理的C. The Sports Festival的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf防沉迷解除教程 解除的方法
- 下一篇: 制作母亲节贺卡 制作母亲节贺卡方法