石子合并(一)
真是动态规划的 题型千千万 .
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 #define N 205 17 int sum[N],stone[N],dp[N][N]; 18 int main() 19 { 20 int n; 21 while(scanf("%d",&n)!=EOF) 22 { 23 sum[0]=stone[0]=0; 24 for(int i=1;i<=n;i++) 25 { 26 scanf("%d",&stone[i]); 27 sum[i]=stone[i]+sum[i-1]; // 这种思想真是一种好东西 // 一维线性 搜索的时候 用这个也能节省超级多的时间 .. 28 } 29 memset(dp,0,sizeof(dp)); // 先将 所有的 全归零 30 for(int d=1;d<n;d++) // 距离 , 确定两两相隔的 距离 31 for(int i=1;i<=n-d;i++) // 从 1 开始 一一确定 . 32 { 33 int j=d+i; // 开始 确定两个 距离的 坐标 34 dp[i][j]=INT_MAX; // 先 默认 距离最大 . 35 int add=sum[j]-sum[i-1]; // 确定这两个数字 之间的 相差 的 知 36 for(int k=i;k<j;k++) // 两个数字 之间错的 坐标 一个个 更新确定 . 37 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+add); 38 } 39 printf("%d\n",dp[1][n]); 40 } 41 return 0; 42 }