UVALive - 6952
2017-02-22 14:26
375 查看
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4964
题意:给你n个数字,可以将某几个连续的数字的和四舍五入,然后问你最多把这些数字分成d个字段之后 他们的和能够最小。
思路: 一个dp题,dp【i】【j】表示到第i个位置分成j段之后的最小花费,对于每到一个新位置,可以选择当前位置切开或者不切,然后枚举切开的次数和位置,去他们的最小值即可。
题意:给你n个数字,可以将某几个连续的数字的和四舍五入,然后问你最多把这些数字分成d个字段之后 他们的和能够最小。
思路: 一个dp题,dp【i】【j】表示到第i个位置分成j段之后的最小花费,对于每到一个新位置,可以选择当前位置切开或者不切,然后枚举切开的次数和位置,去他们的最小值即可。
#include<iostream> #include<cstdio> #include<cstring> #include<map> #include<string> #define inf 0x3f3f3f3f using namespace std; int a[112345]; int dp[2234][22]; int sum[2234]; typedef unsigned long long int ll; int main() { int n,d; sum[0]=0; while(cin>>n>>d) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++) for(int j=1;j<=d;j++) dp[i][j]=inf; for(int i=0;i<=d;i++) dp[0][i]=0; for(int i=1;i<=n;i++) { dp[i][0]=(sum[i]/10)*10; if(sum[i]%10>=5) dp[i][0]+=10; } for(int i=1;i<=n;i++) { for(int j=1;j<=d;j++) for(int k=0;k<i;k++) { int ss=((sum[i]-sum[k])/10)*10; if((sum[i]-sum[k])%10>=5) ss+=10; dp[i][j]=min(dp[i][j],dp[k][j-1]+ss); } } cout<<dp [d]<<endl; } return 0; }
相关文章推荐
- uvalive6952 - Cent Sa dp
- UVALive - 6952 Cent Savings (DP)
- UVALive - 6952 Cent Savings dp
- C - Cent Savings UVALive - 6952
- Cent Savings UVALive - 6952
- UVALive - 6952 (隔板dp)
- UVALive 6270 (ACM-ICPC Live Archive: 6270) Edge Case(大数斐波那契)
- UVALive 5002/ lightoj 1382 The Queue(树形DP)
- uva live 4043 km
- UVALIVE 2519 Radar Installation 区间选点问题
- UVALIVE 3971 Assemble 二分+贪心
- UVALive 3882--And Then There Was One+约瑟夫环问题变形
- UVALive 6170 Esspe-Peasee
- (组队赛E/F Number of Connected Components )UVALive - 7638 (并查集)
- UVALive 3989 - Ladies' Choice(稳定婚姻匹配)
- UVALive-8077 Brick Walls 找规律
- UVALive - 5052 Genome Evolution
- uvalive 2949(二分+贪心)
- UVALive 2889
- UVALive - 5135 Mining Your Own Business(双联通分量)