标签:描述 图片 ring 格式 一条直线 应该 因此 src play
#include <cstdio> #include <cstring> #include <map> #define inf 0x3f3f3f3f using namespace std; int n,temp; int dp[1001][1001],s[1001]; int main() { scanf("%d",&n); for(int i = 1;i <= n;i ++) { scanf("%d",&s[i]); s[i] += s[i - 1]; } for(int h = 1;h <= n - 1;h ++) { for(int i = 1;h + i <= n;i ++) { int j = i + h; dp[i][j] = inf; for(int k = i;k < j;k ++) { temp = dp[i][k] + dp[k + 1][j]; if(dp[i][j] > temp)dp[i][j] = temp;///用min函数会超时。。 } dp[i][j] += s[j] - s[i - 1]; } } printf("%d",dp[1][n]); }
递归记忆化(末点超时):
#include <cstdio> #include <cstring> #include <map> #define inf 0x3f3f3f3f using namespace std; int n; int dp[1001][1001],s[1001]; inline int get(int x,int y) { if(x == y || dp[x][y])return dp[x][y]; int mi = inf; for(int k = x;k < y;k ++) { int temp = get(x,k) + get(k + 1,y); if(mi > temp)mi = temp; } return dp[x][y] = mi + s[y] - s[x - 1]; } int main() { scanf("%d",&n); for(int i = 1;i <= n;i ++) { scanf("%d",&s[i]); s[i] += s[i - 1]; } printf("%d",get(1,n)); }
标签:描述 图片 ring 格式 一条直线 应该 因此 src play
原文地址:https://www.cnblogs.com/8023spz/p/9074439.html