标签:rtu sam include after awk csdn display input bak
2 2
100 1 2
100 1 1
200
1 //mst(dp,0) 初始化DP数组 2 for(int i=1;i<=n;i++) 3 { 4 dp[i][i]=初始值 5 } 6 for(int len=2;len<=n;len++) //区间长度 7 for(int i=1;i<=n;i++) //枚举起点 8 { 9 int j=i+len-1; //区间终点 10 if(j>n) break; //越界结束 11 for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程 12 { 13 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]); 14 } 15 } 16 17 原文链接:https://blog.csdn.net/my_sunshine26/article/details/77141398
1 mst(dp,0x3f); 2 for(int i=1;i<=n;i++) 3 { 4 scanf("%d",&x); 5 sum[i]=sum[i-1]+x; 6 dp[i][i]=0; 7 s[i][i]=i; 8 } 9 for(int len=2;len<=n;len++) 10 for(int i=1;i<=n;i++) 11 { 12 int j=i+len-1; 13 if(j>n) continue; 14 for(int k=s[i][j-1];k<=s[i+1][j];k++) 15 { 16 if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j]) 17 { 18 dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]; 19 s[i][j]=k; 20 } 21 } 22 } 23 printf("%d\n",dp[1][n]);
本题AC代码
#include<bits/stdc++.h> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) const int N=310; int dp[N][N],w[N][N][N],f[N][N]; int n,m; void DP() { for(int i=1;i<=n;i++){ for(int j=i;j>=1;j--){ //for(int k=i,k<=j-1;k++)f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]); for(int k=i;k<=n;k++){ if(j>1) w[i][j-1][k]=max(w[i][j-1][k],w[i][j][k]); if(k<n) w[i][j][k+1]=max(w[i][j][k+1],w[i][j][k]); } } } for(int i=n;i>=1;i--){ for(int j=i;j<=n;j++){ for(int k=i;k<=j-1;k++)dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); for(int k=i;k<=j;k++) dp[i][j]=max(dp[i][j],w[k][i][j]+(k>i?dp[i][k-1]:0)+(k<j?dp[k+1][j]:0)); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int ww,l,r; scanf("%d%d%d",&ww,&l,&r); for(int j=l;j<=r;j++) w[j][l][r]=max(ww,w[j][l][r]); } DP(); printf("%d\n",dp[1][n]); return 0; }
标签:rtu sam include after awk csdn display input bak
原文地址:https://www.cnblogs.com/sylvia1111/p/12251310.html