最小子序列和 单向DP
2013-01-19 21:07
260 查看
最小子序列和
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
#include<stdio.h>
#include<string.h>
#define nmax 16
#define INF 999999999
int dp[2][nmax];
int a[nmax];
int n,k;
int main()
{
int i,j,l,m;
int ans;
while(scanf("%d %d",&n,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[1][i]=dp[0][i]=0;
}
for(i=1;i<=k;i++)
{
ans=INF;
for(j=i;j<=n;j++)
{
dp[1][j]=dp[0][j-1]+a[j]*i;
dp[0][j-1]=ans; //dp[0]存dp[1]所用到上一状态的极值,省去查找最小值的过程
if(ans>dp[1][j])
ans=dp[1][j];
}
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- (HDU 5791)Two <DP求公共子序列的个数> 多校训练5
- #UVA1626#Brackets sequence(括号序列---石子归并类Dp)
- NYOJ 17 单调递增最长子序列 DP
- poj 1631 Bridging signals (LIS 最长递增子序列 DP-二分)
- hdu1159Common Subsequence(DP最长公共递增序列)
- hdu 1231 最大连续子序列(dp)
- HDU 1231 最大连续子序列(DP)
- 夕拾算法进阶篇:13)最大连续子序列(动态规划DP)
- AOJ 189 最长递增子序列(DP)
- Max Sum 最大连续和的子序列 HDU 1003 (一维序列DP)
- HDU 1231:最大连续子序列(DP)
- 1376 最长递增子序列的数量(线段树加DP)
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
- hdu 1069 Monkey and Banana(类似最长上升子序列,dp)
- 【BZOJ3675】序列统计,斜率优化DP
- hihoCoder #1149 : 回文字符序列 - (dp)
- [dp]poj1088_滑雪 二维形式的最长下降子序列
- leetcode 446. Arithmetic Slices II - Subsequence 等差序列的数量 + 一个很值得学习的DP动态规划做法
- 初识动态规划算法,求解最长非递增子序列【DP算法】
- HDU1231最大连续子序列(dp)