您的位置:首页 > 其它

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段之后的最小花费,对于每到一个新位置,可以选择当前位置切开或者不切,然后枚举切开的次数和位置,去他们的最小值即可。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 动态规划