题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4570
题意:题目花了一个乱糟糟的图,然后给了一对乱糟糟的文字,然后抽象出数学模型就是这样的,给你一串数,你可以把它分割成无数段,每一段的权值为该段的第一个数乘上2^该段的长度,问你所有段的权值和最小为多少。
分析:这道题难就难在题意分析上了,题意看明白了,DP随便搞搞就能过了,特别简单,网上什么做法都有,这里给出一个我写的最简洁的,别忘了用long long。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T,n;
long long a[100],dp[100];
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
for(int j=max(0,i-20);j<i;j++)
dp[i]=min(dp[i],dp[j]+a[j+1]*(1<<(i-j)));
cout<<dp[n]<<endl;
}
return 0;
}