您的位置:首页 > 其它

nefu1018数字游戏二【DP】

2015-09-21 21:37 399 查看

description

[code]
有一个长度为n,由数字[0,9]组成的串。我们至多对其进行一次操作,
该操作选定一个区间,将区间内的数 改成 s[i] = (10-s[i])%10  (l<=ii<=r);
求s[0]+s[1]+……+s[n-1] 的最大值。

input

[code]
输入一个n (1<=n<=1000 000) 表示这个字符串的长度,下一行输入一个长度为n
的由0~9组成的字符串

output

[code]
输出这个最大值

sample_input

[code]
3
912
3
999
10
3775053808
10
2580294019
10
4701956095

sample_output

[code]
26
27
50
50
54

hint

[code]
3
912 我们对区间[1,2]进行操作 得到998  ans = 9 + 9 +8 =26
3
999 我们不进行操作 ans = 9+9+9 = 27;

简单的小dp

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[1000005];
int b[1000005];
int dp[1000005];
int main()
{
    int n;
    int sum;
    while(~scanf("%d",&n))
    {
         scanf("%s",a);
         sum=0;
         for(int i=0;i<n;i++) sum+=a[i]-'0';
         int ans=-9999999;
         memset(dp,0,sizeof(dp));
         for(int i=0;i<n;i++)
         {
              b[i]=(10-a[i]+'0')%10-a[i]+'0';
         }
         dp[0]=max(0,b[0]);
         ans=max(0,dp[0]);
         for(int i=0;i<n;i++)
         {
              dp[i]=max(dp[i-1]+b[i],dp[i]);
              ans=max(dp[i],ans);
         }
         printf("%d\n",ans+sum);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: