您的位置:首页 > 其它

51nod 1021 石子归并

2017-04-21 23:10 253 查看
基础dp题

联想上学期学过的加括号问题/矩阵连乘问题

其实就是对一个大问题,找一个分割,使得这种分割满足最优子结构

没看四边形优化的解,就这样吧先。。这代码还多数是copy别人的,边写边学吧。

//@auther zhou
//@Number 201408070203
//@start time:
//@finish time:
/*@此处注意:

*/
/* 测试数据

*/
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
#define inf 1e9
int main(){
int n;
cin>>n;
// vector<int > a;
// vector<int> total;
int a[105]={0};
int total[105]={0};
int temp,ans=0;
for(int i=1;i<=n;i++){
cin>>temp;
ans+=temp;
// total.push_back(ans);
// a.push_back(temp);
a[i]=temp;
total[i]=ans;
}

// for(int i=1;i<=n;i++){
// cout<<a[i]<< " "<<total[i]<<endl;
// }

int dp[105][105];
memset(dp,inf,sizeof(dp));
for(int i=1;i<=n+1;i++)
dp[i][i]=0;

int j=0;

for(int width=2;width<=n;width++){//width
for(int i=1;i<=n-width+1;i++){//start
j=i+width-1;//end
dp[i][j]=inf;
for(int k=i;k<=j-1;k++){//loop cut index
temp=total[j]-total[i-1];
dp[i][j]=min(dp[i][k]+dp[k+1][j]+temp,dp[i][j]);
}
}
}
cout<<dp[1]
;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: