区间dp(整数划分,石子划分)

ゞ 浴缸里的玫瑰 2022-09-18 13:56 316阅读 0赞

整数划分(四)

链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=746

基础区间dp,代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. long long a[20][20];
  4. long long dp[25][25];
  5. int main()
  6. {
  7. int T,m;
  8. scanf("%d",&T);
  9. getchar();
  10. while(T--)
  11. {
  12. char s[22];
  13. scanf("%s",s+1);
  14. scanf("%d",&m);
  15. int l=strlen(s),ok=1;
  16. memset(a,0,sizeof(a));
  17. for(int i=1;i<l;i++)
  18. {
  19. if(s[i]=='0')
  20. ok=0;
  21. for(int j=i;j<l;j++)
  22. {
  23. a[i][j]=a[i][j-1]*10+(s[j]-'0');
  24. }
  25. }
  26. if(ok==0&&l-1==m||l-1<m)
  27. {
  28. printf("0\n");continue;
  29. }
  30. long long x,ans;
  31. memset(dp,0,sizeof(dp));
  32. for(int i=0;i<l;i++)
  33. dp[i][1]=a[1][i];
  34. ans=0;
  35. if(m==1)
  36. ans=dp[l-1][1];
  37. for(int j=2;j<=m;j++)
  38. {
  39. for(int i=j;i<l;i++)
  40. {
  41. ans=a[i][i];
  42. for(int k=1;k<i;k++)
  43. {
  44. x=dp[k][j-1]*a[k+1][i];
  45. if(x>ans)
  46. ans=x;
  47. }
  48. dp[i][j]=ans;
  49. }
  50. }
  51. printf("%lld\n",ans);
  52. }
  53. return 0;
  54. }

石子合并(一)

链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=737

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #define N 210
  4. int dp[N][N],sum[N];
  5. int main()
  6. {
  7. int n;
  8. while(~scanf("%d",&n))
  9. {
  10. int a[N];sum[0]=0;
  11. for(int i=1;i<=n;i++){
  12. scanf("%d",&a[i]);
  13. sum[i]=sum[i-1]+a[i];
  14. }
  15. memset(dp,0,sizeof(dp));
  16. int i,j,l,k;
  17. for(l = 2; l <= n; ++l)
  18. {
  19. for(i = 1; i <= n - l + 1; ++i)
  20. {
  21. j = i + l - 1;
  22. dp[i][j] = 2100000000;
  23. for(k = i; k < j; ++k)
  24. {
  25. int q = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i-1];
  26. if(dp[i][j] > q)
  27. dp[i][j] = q;
  28. }
  29. }
  30. }
  31. printf("%d\n", dp[1][n]);
  32. }
  33. return 0;
  34. }

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 整数划分 区间dp

    题目链接[点击打开链接][Link 1] 题目大意是说有一个不超过二十位的数字,要将这个数字划分成n段,最后让这n段数字相乘,问怎么划分使乘积最大。 分析: 一

    相关 整数划分问题

    问题描述:将以正整数n表示成一系列正整数之和。 输入:整数N 输出:划分方法的总数。 //n为输入的整数,不同划分中最大加数不超过m,返回划分方法的总数。 int q(

    相关 整数划分--DP

    5. [数的划分][Link 1] 问题描述   将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。   例如:n=7,k=3,下面三种分法被认为是相同

    相关 整数划分 dp

    蒜头君特别喜欢数学。今天,蒜头君突发奇想:如果想要把一个正整数 nn 分解成不多于 kk 个正整数相加的形式,那么一共有多少种分解的方式呢? 蒜头君觉得这个问题实在是太难了,