Contest1173 - 20180606限时练习

P1615 A组合字符串
简析:我们发现,三个字符串a,b,c,c中的字符不属于a就属于b,我们可以code出一个搜索,然后改成记忆化

#include<bits/stdc++.h>
#define N 2005
using namespace std;
int f[N][N],n,m,len;
char a[N],b[N],c[N]; 
int dfs(int i,int j){
    if(i+j==len){
        if(i==n&&j==m)return 1;
        else return 0; 
    }
    if(f[i][j]!=-1)return f[i][j];
    int res=0;
    if(c[i+j+1]==a[i+1]&&i!=n)res=res|dfs(i+1,j);
    if(c[i+j+1]==b[j+1]&&j!=m)res=res|dfs(i,j+1);
    return f[i][j]=res;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%s%s%s",a+1,b+1,c+1);
        n=strlen(a+1);m=strlen(b+1);len=strlen(c+1);
        for(int i=0;i<=n;i++)
            for(int j=0;j<=m;j++)
                f[i][j]=-1;
        printf(dfs(0,0) ?"Yes\n":"No\n");
    }
    return 0;
}

P1638 B 我要的幸福
简析:因为要使字典序最小,所以可以得出贪心策略:每次可以走的方向中选择更小的一个,如果走到走过的点,因为之前的字典序一定小于当前,所以返回。因为保证权值两两不同,于是用dfs回溯即可,每个点只更新一次,所以不会TLE。

#include<bits/stdc++.h>
#define N 1006
using namespace std;
int a[N][N],vis[N][N],ans[2*N];
int n,m,cnt;
void dfs(int x,int y){
    if(x<1||x>n||y<1||y>m)return;
    if(vis[x][y]==1||a[x][y]==0)return;
    ans[++cnt]=a[x][y]; 
    vis[x][y]=1;
    if(x==n&&y==m){
        printf("%d",ans[1]);
        for(int i=2;i<=cnt;i++)printf(" %d",ans[i]);
        exit(0);      
    }
    if(a[x+1][y]<a[x][y+1]){
        dfs(x+1,y); 
        dfs(x,y+1);
    }else{
        dfs(x,y+1);
        dfs(x+1,y);
    }
    cnt--;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    memset(vis,0,sizeof(vis)); 
    dfs(1,1);
    printf("Oh,the life is too difficult!\n");
    return 0;
}

P1637 C 构造回文字符串
简析:回文串的正反的字符串相同,所以可以对正反的字符串做最长公共子序列
做出来的就是原串的不需要加匹配的字符数,与长度相减就是答案。

#include<cstdio>
#include<algorithm>
#define N 5005
using namespace std; 
int n; char a[N],b[N];int f[N][N]; 
int main() { 
    scanf("%d",&n); 
    scanf("%s",a+1); 
    for(int i=1;i<=n;i++) b[i]=a[n-i+1]; 
    for(int i=1;i<=n;i++)  
        for(int j=1;j<=n;j++)  
            if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1; 
            else f[i][j]=max(f[i-1][j],f[i][j-1]); 
    printf("%d",n-f[n][n]); 
    return 0; 
} 

猜你喜欢

转载自blog.csdn.net/qq_36316033/article/details/80593344
今日推荐