2 条题解

  • 0
    @ 2025-10-8 16:58:43
    #include<bits/stdc++.h>
    using namespace std;
    char s[110];
    int a[110], f[110][110];
    int main()
    {
    	scanf("%s", s+1);
    	int len = strlen(s+1);
    	memset(a, 0, sizeof(a));
    	for (int i=1; i<=len; i++)
    		switch(s[i])
    		{
    			case '(':a[i] = 1;break;
    			case '[':a[i] = 2;break;
    			case ']':a[i] = 3;break;
    			case ')':a[i] = 4;
    		}
    	memset(f, 0, sizeof(f));
    	for (int i=1; i<=len; i++)f[i][i]=1;
    	for (int l=2; l<=len; l++)
    	{
    		for (int i=1; i<=len-l+1; i++)
    		{
    			int j=l+i-1;
    			f[i][j]=101;if(a[i] + a[j] == 5 && a[i] < a[j])f[i][j] = f[i+1][j-1];
    			for (int k=i; k < j; k++)f[i][j] = min(f[i][j], f[i][k] + f[k+1][j]);
    		}	
    	}
    	printf("%d", f[1][len]);
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:58:33
      #include<bits/stdc++.h>
      using namespace std;
      char s[110];
      int a[110],f[110][110];
      int main()
      {
      	scanf("%s",s+1);
      	int len =strlen(s+1);
      	memset(a,0,sizeof(a));
      	for (int i=1;i<=len;i++)
      		switch(s[i])
      		{
      			case '(':a[i] = 1;break;
      			case '[':a[i] = 2;break;
      			case ']':a[i] = 3;break;
      			case ')':a[i] = 4;
      		}
      	memset(f,0,sizeof(f));
      	for (int i=1;i<=len;i++)f[i][i]=1;
      	for (int l=2;l<=len;l++)
      	{
      		for (int i=1; i<=len-l+1;i++)
      		{
      			int j=l+i-1;
      			f[i][j]=101;if(a[i]+a[j]==5 && a[i]<a[j])f[i][j]=f[i+1][j-1];
      			for (int k=i;k<j; k++)f[i][j]=min(f[i][j],f[i][k] + f[k+1][j]);
      		}	
      	}
      	printf("%d",f[1][len]);
      	return 0;
      }
      • 1

      *【动态规划:区间中间推】括号配对

      信息

      ID
      1814
      时间
      1000ms
      内存
      512MiB
      难度
      7
      标签
      递交数
      15
      已通过
      8
      上传者