标签:
Time Limit: 20 Sec
Memory Limit: 256 MB
http://acm.uestc.edu.cn/#/problem/show/1131
Input
Output
每组数据一行输出,表示男神制作这份礼物所要的最小体力。
Sample Input
2
2
18 19
3
40 60 20
342
2400
对于样例 2:
先加工材料40和60,得到0的材料,消耗40∗60体力,共消耗2400体力;
再加工材料0和20,得到20的材料,消耗0∗20体力,共消耗2400体力.
题意
题解:
区间dp,类似于石子合并的问题,每次每枚举合并的点就好了
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; const int inf=0x7fffffff; //нчоч╢С /* inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** ll dp[101][101]; ll a[101]; ll sum[101]; int main() { int t=read(); while(t--) { memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); int n=read(); for(int i=1;i<=n;i++) { a[i]=read(); sum[i]=a[i]+sum[i-1]; } for(int r=2;r<=n;r++) { for(int i=r-1;i>=1;i--) { for(int j=i;j<=r;j++) { ll kiss=((sum[j]-sum[i-1])%100)*((sum[r]-sum[j])%100); if(dp[i][r]==0) dp[i][r]=dp[i][j]+dp[j+1][r]+kiss; else dp[i][r]=min(dp[i][r],dp[i][j]+dp[j+1][r]+kiss); } } } cout<<dp[1][n]<<endl; } }
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4561367.html