1 条题解

  • 0
    @ 2026-2-11 10:58:00
    #include<bits/stdc++.h>
    using namespace std;
    char s[110],s1[110],s2[110];
    int f[110][110];
    
    int main()
    {
    	int n1,n2;
    	scanf("%s",s+1);n1=strlen(s+1);
    	for(int i=1;i<=n1;i++) s1[i]=s[n1-i+1];
    	scanf("%s",s+1);n2=strlen(s+1);
    	for(int i=1;i<=n2;i++) s2[i]=s[n2-i+1];
    
    	memset(f,-63,sizeof(f));
    	for(int i=1;i<=n1;i++)f[i][0]=-1;
    	for(int i=1;i<=n2;i++)f[0][i]=-1;
    	f[0][0]=0;
    	
    	for(int i=1; i<=n1;i++)
    		for(int j=1;j<=n2;j++)
    		{
    			if(s1[i]==s2[j])f[i][j]=2+f[i-1][j-1];
    			else f[i][j]=f[i-1][j-1];
    			for(int k=j-1;k>=1;k--)f[i][j]=max(f[i][j],f[i][k]-1);
    			for(int k=i-1;k>=1;k--)f[i][j]=max(f[i][j],f[k][j]-1);
    		}
    	int ans=-999999;
    	for(int i=1;i<=n1;i++) ans=max(ans,f[i][n2]);
    	for(int i=1;i<=n2;i++) ans=max(ans,f[n1][i]);
    	printf("%d\n",ans); 
    	return 0;
    }
    
    • 1

    *【动态规划:区间二维一边推】顺序对齐

    信息

    ID
    147
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    124
    已通过
    46
    上传者