HDU 5617 多维dp降维问题,回文串匹配

来源:互联网 发布:备案域名可以不注销吗 编辑:程序博客网 时间:2024/06/01 10:22

给你一个n*n的矩阵。  求从(1,1)走到(n,n)所组成的回文串个数。只可以向右或者向下走。

思路:

1.此题的“序” 是这个二维坐标。

2.影响决策的因素是前后字符串是否比配。

3.状态及其考虑的方案:

因为是回文串问题,所以要考虑从首尾两个位置进行枚举看看相对应的位置是否相等,同时再记录他们的对应位置的相匹配的数量。

可以设从起点(1,1)和终点(n,n)同时出发,计算分别到达(x1,y1)和(x2,y2)的位置时  相匹配的数量,此时我们可以用dp[x1][y1][x2][y2]记录。

(x1,y1)和(x2,y2)位置的字符相等时,

4状态转移方程:只需要计算dp[x1][y1][x2][y2]=dp[x1-1][y1][x2+1][y2]+dp[x1-1][y1][x2][y2+1]+dp[x1][y1-1][x2+1][y2]+dp[x1][y1-1][x2][y2+1].

但此题,n=500会超内存,所以我们就想着去降低维度,因为回文串前后对应的长度是相等的所以我们可以表示为dp[ i ][ x1 ][ x2 ]。用 i 表示已经走的步数,而此时对应的y1=i-x1+2;  y2=2*n-i-x2;   但是此时的为 500*500*500还需要降维 ,此时就用到了滚动数组。因为当前状态只与前一个状态有关。

注意:
写滚动数组一定要注意,初始的状态的01表示,与结束状态的01表示,状态只有前一次的状态有关,所以对于当前状态一定要记得初始化,防止状态i-2对
状态i造成影响。
<pre name="code" class="cpp">/****************************************/#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int N =510;const int mod =5201314;char s[N][N];int dp[2][N][N];int main(){    int t,n;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        for(int i=1;i<=n;i++){            scanf("%s",s[i]+1);        }        memset(dp,0,sizeof(dp));        if(s[1][1]==s[n][n])            dp[0][1][n]=1;         ///初始状态        int p=1;                   ///滚动数组的下一状态        for(int i=1;i<n;i++){        ///是n-1步            for(int x1=1;x1<=n;x1++){                for(int x2=n;x2>=1;x2--){                    dp[p][x1][x2]=0;            ///初始化*****                                        int y1=i-x1+2;                    int y2=2*n-i-x2;                    if(s[x1][y1]!=s[x2][y2])continue;                    dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1-1][x2])%mod;                    dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1-1][x2+1])%mod;                    dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1][x2+1])%mod;                    dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1][x2])%mod;                }            }            p=!p;        }        int sum=0;        for(int i=1;i<=n;i++){            sum=(sum+dp[!p][i][i])%mod;        }        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击