P1481 魔族密码

题目地址:https://www.luogu.org/problem/show?pid=1481

这题于矩形嵌套问题类似,如果某个单词时是令一个单词的前缀,那么就是说a到b有一条有向边,那么就转化成为了DAG上的动态规划。

#include
#include
#include
#include
using namespace std;
const int MAXN=2000+5;
char s[MAXN][76];
int n,ans,f[MAXN];
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {    
        scanf("%s",s[i]);
    }
    f[1]=1;
    for(i=2;i<=n;i++)
    {
        int maxx=0;
        for(j=i-1;j>=1;j--)
        {
            int l=strlen(s[j]);
            if(maxx
吃惊的是这题也可以用栈来做(就与codevs1051一样了,甚至不需要排序),不过要慢一些。

#include
#include
#include
#include
#include
#include
using namespace std;
int n;
string s[1000001];
string a[1000001];
int k=0;
int top=0;
bool pd(string x,string y)
{
    if(x==y) return 0;
    int l=x.size();
    if(x!=y.substr(0,l)) return 0;
    return 1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>s[i];
    sort(s+1,s+n+1);
    for(int i=1;i<=n;i++)
    {
    if(top==0)
    {top++;
    a[top]=s[i];}
    else
    while(top>0)
    {
        if(pd(a[top],s[i])==1)
        {
            top++;
            a[top]=s[i];
            break;
        }
        else
        top--;
    }
    if(top==0)
    {
        top++;
        a[top]=s[i];
    }
    k=max(k,top);
    }
    cout<



你可能感兴趣的:(动态规划,栈)