题目描述
在你的帮助下,G调整好了石块和荷叶的位置。D和Z踩着石块过了池塘,却发现G不见了。
原来G被大Boss捉走了。
大Boss有一种很厉害的武器,叫做能量球,它是由许多能量珠合成的。大Boss的能量球刚好用完了,他捉来了G,让G为他制作能量球。
能量球的制作方式如下:
现在有一串能量珠,每次合并两个相邻的能量珠,得到的新能量珠的能量为两个能量珠能量之和。而最终得到的大能量球的能量为每次得到的新能量珠的能量总和。
G知道,大Boss制作能量球是为了对付D和Z,所以她会尽量使得她制作的能量球能量值尽量小。
输入
共2行。
第1行一个整数n(1≤n≤200),表示共n个能量珠。
第2行n个整数,表示一串能量珠,其中第1颗和最后一颗能量珠是相连接的。
输出
一个整数,表示最小能量值。
思路
剖分问题,和矩阵链相乘类似,但是会超时,所以我们就要用四边形不等式优化(http://blog.csdn.net/qq_33229466/article/details/51484265)但是我用O2水了过去。。。
| #include |
| #include |
| using namespace std; |
| int r[10005],c[5000][5000],sum[10005]; |
| int ans=10000000; |
| __attribute__((optimize("O2"))) |
| int min(int x,int y) |
| { |
| return x |
正解
|
|
| |
| using namespace std; |
| int r[10005],c[5000][5000],sum[10005],s[1000][1000]; |
| int ans=10000000; |
| __attribute__((optimize("O2"))) |
| int min(int x,int y) |
| { |
| return xmain() |
| { |
| freopen("power.in", "r", stdin); |
| freopen("power.out", "w", stdout); |
| int n; |
| scanf("%d",&n); |
| for (int i=1;i<=n;i++) |
| { |
| scanf("%d",&r[i]); |
| sum[i]=sum[i-1]+r[i]; |
| r[i+n]=r[i]; |
| } |
| |
| for (int l=1;l<=n;l++) |
| { |
| for (int i=1;i<=n;i++) |
| { |
| c[i][i]=0; |
| s[i][i]=i; |
| } |
| for (int d=1;d<=n-1;d++) |
| for (int i=1;i<=n-d;i++) |
| { |
| int j; |
| j=i+d; |
| c[i][j]=0xfffffff; |
| int tmp=sum[j]-(i>0?sum[i-1]:0); |
| for (int k=s[i][j-1];k<=s[i+1][j];k++) |
| { |
| if (c[i][j]>c[i][k]+c[k+1][j]+tmp) |
| { |
| c[i][j]=c[i][k]+c[k+1][j]+tmp; |
| s[i][j]=k; |
| } |
| } |
| } |
| ans=min(ans,c[1][n]); |
| for (int i=1;i<=10000;i++) |
| { |
| r[i]=r[i+1]; |
| sum[i]=sum[i-1]+r[i]; |
| } |
| } |
| printf("%d\n",ans); |
| return 0; |
| } |
查看评论 - NOTHING
Comments NOTHING
暂无评论