zoukankan      html  css  js  c++  java
  • CF607B

    区间dp 注意len==2的特判问题

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<cstdio>
     5 #define INF 1e9
     6 using namespace std;
     7 const int maxn = 5e2 + 10;
     8 int n;
     9 int a[maxn];
    10 int dp[maxn][maxn];
    11 
    12 int main(){
    13     scanf("%d",&n);
    14     for(int i = 1 ; i <= n ; i++){
    15         for(int j = i ; j <= n ; j++){
    16             dp[i][j] = INF;
    17         }
    18     }
    19     for(int i = 1 ; i <= n ; i++){
    20         scanf("%d",&a[i]);
    21         dp[i][i] = 1;
    22     }
    23     for(int i = 1 ; i < n ; i++){
    24         dp[i][i + 1] = a[i] == a[i + 1] ? 1 : 2;
    25     }//若枚举len从2开始,dp[i+1][j-1]将无法被覆盖,因此需要特判 
    26     for(int len = 3 ; len <= n ; len++){
    27         for(int i = 1 ; i + len - 1 <= n ; i++){
    28             int j = i + len - 1;
    29             for(int k = i ; k <= j - 1 ; k++){
    30                 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
    31             }
    32             if(a[i] == a[j] && i + 1 <= j - 1)    dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);
    33         }
    34     }
    35     printf("%d
    ",dp[1][n]);
    36     
    37     return 0;
    38 }
  • 相关阅读:
    strlen和sizeof
    函数值传递和地址传递
    指向函数的指针变量
    for循环scanf赋值刷新缓冲区
    指针
    排序简化
    随机数找到最大值
    上楼梯问题
    分布式系统并发情况下会生成多个token
    Swagger 文档生成工具
  • 原文地址:https://www.cnblogs.com/ecustlegendn324/p/13797896.html
Copyright © 2011-2022 走看看