HDU 2296 Ring AC自动机加上字符串dp

http://acm.hdu.edu.cn/showproblem.php?pid=2296

题意:构造一个长度为n的字符串,价值最大。

看见网上的大佬都说很简单,但不过我还是错了24次,最后看了博客还是不知道,然后一部分的按着博客的改,最后还是错了,隔了很久发现AC自动机写错了,最后改了也不对,第二天重新写了几发就对了。

做法,利用AC自动机可以记录字符串匹配的状态的一个路径的思想,构建一个dp[i][j],表示长度为i,在自动机中的节点是j的最大价值,递推方程显然就出来了,遍历长度和自动机的每一个结点,dp[i+1][j]=max(dp[i][所有能到达j的点] + val[j])。

#include
using namespace std;

typedef long long ll;
const int MAXN=1200;
const int N=26;
int dp[55][MAXN];
char ans[55][MAXN][55];
struct node
{
    int l,root,val[MAXN],next[MAXN][N+5],fail[MAXN];
    queuequ;
    int newnode()
    {
        for(int i=0;imaxn)
                {
                    maxn=dp[i][j];
                    ii=i,jj=j;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;jl2)
                        continue;
                    else if(l1==l2)
                    {
                        if(strcmp(ans[i][j],ans[ii][jj])<0)
                            ii=i,jj=j;
                    }
                    else if(l1

 

你可能感兴趣的:(ACM题解,动态规划,字符串)