diff --git a/README.md b/README.md index 874f933..22c3c15 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -## 线性动态规划优化为O(nlogn)方法 +## 线性动态规划优化为$O(n\log{n})$方法 >如果是递增序列就lower_bound ->如果是递减序列就手写二分 \ No newline at end of file +>如果是递减序列就手写二分 + +## 区间dp +1. 根据问题推出dp含义 +2. 根据规则写出dp的状态转移公式 +3. 处理边界问题 \ No newline at end of file diff --git a/src/8/26/P5424.cpp b/src/8/26/P5424.cpp new file mode 100644 index 0000000..d4060c7 --- /dev/null +++ b/src/8/26/P5424.cpp @@ -0,0 +1,54 @@ +/* + +dp[i][j] +前i组蛇,用j个网的最小浪费空间 + +dp[i][j]=min(dp[i][j],dp[k][j-1]+cnt[k+1][i]) + +dp[i][j]=1e9 +dp[0][0]=0 + +*/ + +#include +#include +#include +#include +#include + +using ll = int64_t; + +int main(){ + std::iostream::sync_with_stdio(false); + std::cin.tie(nullptr); + + ll n,k; + std::cin>>n>>k; + std::vector v(n+1); + std::vector> cnt(n+1,std::vector(n+1));//cnt[i][j]=i-j用一个网浪费的空间 + std::vector> dp(n+1,std::vector(k+1, 1e9)); + dp[0][0]=0; + + for(ll i=1;i<=n;i++){ + std::cin>>v[i]; + } + for(ll i=1;i<=n;i++){ + for(ll j=i;j<=n;j++){ + ll nmax = *std::max_element(v.begin()+i,v.begin()+j+1); + ll ncnt=0; + for(ll k=i;k<=j;k++){ + ncnt+=nmax-v[k]; + } + cnt[i][j]=ncnt; + } + } + for(ll i=1;i<=n;i++){ + dp[i][1]=cnt[1][i]; + for(ll j=2;i<=k;j++){ + for(ll k=1;k