您的位置:首页 > 其它

DUT 1089 A Water Problem

2017-03-16 09:25 281 查看
设f(n)表示对n长度的字符串所需要的最小代价。

考虑当n为偶数时,通过倍增超出n长度后,又通过删除来得到一个n长度的字符串的方式:

f(n)=f(n2)+y

f(n)=f(n2+a)+2ax+y

由题目可以得到:

f(n2+a)+ax≥f(n2+a)+2ax≥f(n2+a)+2ax+y≥f(n2+a)+2ax+y>f(n2)f(n2)+axf(n2)+ax+yf(n2)+y

故对于偶数的n,超出长度后删除的方式将不可能得到一个更优的解。

对于为奇数的n,其可以通过f(n+12)+x+y转移,由对偶数n的证明可以知道,任何的超出n+12的决策也不可能是更优的,故有以下状态方程:

f(n)=min(f(n−1)+x,f(n+12)+x+y)|n∈odd

f(n)=min(f(n−1)+x,f(n2)+y)|n∈even

对于107的线性dp这个时限和内存都是随便跑的,实现上没有什么问题。

#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
ll dp[10000010],x,y;int n;
bool cl(){
int i,j;if(!(cin>>n>>x>>y))return 0;
for(dp[1]=x,i=2;i<=n;++i)
dp[i]=i&1?min(dp[i-1]+x,dp[(i+1)>>1]+x+y):min(dp[i-1]+x,dp[i>>1]+y);
cout<<dp
<<endl;
return 1;
};
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(cl());
return 0;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: