划分dp,区间差最小
2017-05-09 17:13
232 查看
题目链接:http://codevs.cn/problem/3162/
分析:思路一样,但半天没写出dp方程= =。看了题解才知道,可以先求到 j 个人最多的抄书数目 ,再求最小dp[[i][j]
分析:思路一样,但半天没写出dp方程= =。看了题解才知道,可以先求到 j 个人最多的抄书数目 ,再求最小dp[[i][j]
#include <bits/stdc++.h> using namespace std; #define maxn 105 int m , k; int dp[maxn][maxn]; int a[maxn]; int s[maxn]; int l[maxn]; int r[maxn]; int main() { cin >> m >> k; for(int i = 1 ; i <= m ; ++i) scanf("%d",&a[i]),s[i] = s[i-1] + a[i]; memset(dp,0x7f,sizeof(dp)); for(int i = 1 ; i <= m ; ++i) dp[i][1] = s[i]; for(int i = 1 ; i <= m ; ++i) for(int j = 2 ; j <= k && j <= m ; ++j) for(int x = 1 ; x < i ; ++x) dp[i][j] = min(dp[i][j],max(dp[x][j-1],s[i]-s[x])); int mm = dp[m][k] ; // cout << mm << endl; int right = m; int cnt = 0; int sum = 0; int i = m; while( i >= 1 ) { while( sum + a[i] <= mm && i >= 1 ) { sum += a[i]; i--; } l[cnt] = i + 1; r[cnt++] = right; right = i; sum = 0 ; } for(int i = cnt-1 ; i >= 0 ; --i) { printf("%d %d\n",l[i],r[i]); } }
相关文章推荐
- 区间DP 最大面积最小的三角形划分
- 【Codeforces Round 336 (Div 2) D】【区间DP 讨论 好题】Zuma 区间取回文串最小操作次数使得取光全串
- NYOJ 746 整数划分(四)区间DP
- (UVA - 11584) Partitioning by Palindromes(DP,划分的最小回文串个数)
- 南阳理工746整数划分(区间dp)
- 区间dp(整数划分,石子划分)
- NYOJ 整数划分(四) (区间dp)
- nyoj746 整数划分(四)【区间dp】
- uva 10453 Make Palindrome(区间DP->回文字符串的最小生成)
- NYOJ - 746 - 整数划分(四)(区间DP)
- nyoj746整数划分(四)【区间dp】
- 区间dp模型(石子归并,括号匹配,整数划分)
- NYOJ746 整数划分(区间DP)
- SDNU1331 二分法求,确定划分次数后的最小连续区间和
- NYOJ746 整数划分(四)(深搜DFS,区间DP)
- 区间dp 整数划分问题
- 整数划分(区间dp)
- codeforce Maximum of Maximums of Minimums(区间划分 求区间最小值最大值问题)
- NYOJ 746 整数划分(四)详解 (区间DP)
- POJ1141 Brackets Sequence (最小括号匹配升级版:区间DP+打印路径)