当一个人的程序在不同的人手下运行出不同的结果时我就知道了
我TMD该洗脸了……
题目描述 Description
有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。
输入描述 Input Description
第一行一个整数n(n<=100)
第二行n个整数w1,w2…wn (wi <= 100)
输出描述 Output Description
一个整数表示最小合并代价
样例输入 Sample Input
4
4 1 1 4
样例输出 Sample Output
18
这个题是dp的入门题……
我写了个程序,然后发现样例跑出来是14……
然后各种看……就是看不出来……
下午,我们的来自上一级的红太阳——DQS来了!
他给我看了看代码,修了修就正常输出了。
但是!根本没改什么实质性问题
所以我又试着用我的原来的程序跑一遍
然后
woc!!!
这件事告诉我们,写代码之前请洗脸……
附代码
#include<iostream>
#include<cstdio>
using namespace std;
int num[110],dp[110][110],sum[110];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
sum[i]=sum[i-1]+num[i];
for(int j=1;j<=n+6;j++)
{
if(j==i)continue;
dp[i][j]=0x7fffff;
}
}
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
cout<<dp[1][n];
return 0;
}
DQS大爷改后的
#include<iostream>
#include<cstdio>
using namespace std;
int num[110],dp[110][110],sum[110];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
sum[i]=sum[i-1]+num[i];
for(int j=1;j<=n+6;j++)
{
if(j==i) continue;
dp[i][j]=0x7fffffff;
}
}
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
for(int k=i;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
/* for(int i=1;i<=n;i++,puts(""))
{
for(int j=1;j<=n;j++)
{
cout<<dp[i][j] << " ";
}
} */
cout<<dp[1][n];
return 0;
}