山东理工周赛 3 简单单调队列优化dp
2013-01-19 17:58
363 查看
最小子序列和
Time Limit: 1000MS Memory limit: 65536K
题目描述
给你一个长为n(10<=n<=10000)的数组,数组中的每一个数大于等于1小于等于1000000。请你找出一个长为k(100<=k<=1000)的子序列。找序列时,假如第一个数找的是数组中的第i个位置的数,那么找第二个数时只能找数组中第i个位置后的数,依次找出k个数。使得第一个数*1+第二个数*2+...+第k个数*k的值最小。输入
有多组(小于11组)测试数据,每组第一行输入n和k(用空格隔开),第二行输入n个数(数之间用空格隔开)。输出
请输出最小的和。示例输入
15 5 5 4 3 2 1 1 2 3 4 5 5 4 3 2 1
示例输出
19//最大m段字段和!! #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=1000002; long long int INF=1000*1000000; int a[maxn],n,m; long long int dp[2][maxn],ans; long long max(long long a,long long b) { return a>=b?a:b; } long long min(long long a,long long b) { return a<=b?a:b; } int main() { //freopen("//media/学习/ACM/input.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { int i,j; for( dp[0][0]=0,i=1;i<=n;i++)scanf("%d",&a[i]),dp[1][i]=dp[0][i]=0; for(i=1;i<=m;i++) { ans=INF;//代表j之前 for(j=i;j<=n;j++) { dp[1][j]=dp[0][j-1]+a[j]*i; dp[0][j-1]=ans; if(ans>dp[1][j])ans=dp[1][j]; } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- poj 2823 简单单调队列优化dp
- Buy Tickets hoj 单调队列优化DP的简单应用
- BZOJ2806 [Ctsc2012]Cheat 【后缀自动机 + 二分 + 单调队列优化DP】
- poj 3017 单调队列优化DP
- Gift (单调队列优化dp)
- LA 3983 - Robotruck 单调队列优化DP
- uva 1427(单调队列优化dp)
- 单调队列优化dp
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
- 【大渣】【DP+单调队列优化】布丁
- bzoj3831 洛谷3572 little bird 单调队列优化dp
- ACdream群OJ 1074 风之国 单调队列优化DP
- 单调队列优化DP能到什么程度(今天中午进行的实验记录)
- Vijos 1243 初探单调队列优化DP
- POJ 1821 Fence 单调队列优化dp
- codevs 3327(dp+单调队列优化)---以此记录我的脑残经历
- POJ 3926 Parade 单调队列优化DP
- hdu(HDU5945)单调队列优化DP
- HDU - 3401 单调队列优化DP
- dp的斜率优化与单调队列优化