【SDUT [2146]最小子序列和】
2016-09-12 10:28
148 查看
最小子序列和
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给你一个长为n(10<=n<=10000)的数组,数组中的每一个数大于等于1小于等于1000000。请你找出一个长为k(100<=k<=1000)的子序列。找序列时,假如第一个数找的是数组中的第i个位置的数,那么找第二个数时只能找数组中第i个位置后的数,依次找出k个数。使得第一个数*1+第二个数*2+…+第k个数*k的值最小。
Input
有多组(小于11组)测试数据,每组第一行输入n和k(用空格隔开),第二行输入n个数(数之间用空格隔开)。
Output
请输出最小的和。
Example Input
15 5
5 4 3 2 1 1 2 3 4 5 5 4 3 2 1
Example Output
19
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给你一个长为n(10<=n<=10000)的数组,数组中的每一个数大于等于1小于等于1000000。请你找出一个长为k(100<=k<=1000)的子序列。找序列时,假如第一个数找的是数组中的第i个位置的数,那么找第二个数时只能找数组中第i个位置后的数,依次找出k个数。使得第一个数*1+第二个数*2+…+第k个数*k的值最小。
Input
有多组(小于11组)测试数据,每组第一行输入n和k(用空格隔开),第二行输入n个数(数之间用空格隔开)。
Output
请输出最小的和。
Example Input
15 5
5 4 3 2 1 1 2 3 4 5 5 4 3 2 1
Example Output
19
#include<cstdio> #include<cstring> using namespace std; int pa[100011]; int dp[2][100011]; int main() { int i,n,k,pl,j,ans; while(scanf("%d%d",&n,&k)!=EOF) { for (i = 1 ;i <= n; i++) scanf("%d",&pa[i]); memset(dp,0,sizeof(dp)); for(i = 1; i <= k; i++) { ans = 0x3f3f3f3f; for( j = i ; j <= n ; j++) { dp[1][j] = dp[0][j-1] + pa[j] * i; //当前最优解 = 在 j 之前的最优解 + pa[j] * i; dp[0][j-1] = ans; // 当前 j-1最优解 if(ans > dp[1][j]) ans = dp[1][j]; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 【SDUT】[2146]最小子序列和
- SDUT-OJ 2403 单峰序列
- sdut 3334 数据结构实验之栈七:出栈序列判定
- 上升子序列(SDUT2171)
- SDUT-OJ 2403 单峰序列
- 连续最大子序列和与最小子序列和
- sdut 2140 有向图中是否存在拓扑序列的判断
- SDUT 3334 数据结构实验之栈与队列七:出栈序列判定
- SDUT 3648 迷の有序序列 (动态规划) -- 解题报告
- 最小子序列和 单向DP
- SDUT 1266-出栈序列的统计(DFS)
- SDUT 2140 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列 SDUT 2140
- SDUT__汤圆系列之迷の汤圆序列
- [SDUT](3334)数据结构实验之栈七:出栈序列判定 ---栈
- SDUT 3334 数据结构实验之栈与队列七:出栈序列判定
- SDUT 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT 3334 数据结构实验之栈七:出栈序列判定
- 最小子序列--分治算法