zoj1425Crossed Matchings

1612 단어 match
와글와글또 A를 했다.
방금 쓴 건데 너무 설레요.
오후에 제목을 봤는데 제목은 두 줄의 숫자로 되어 있고 위아래와 같은 숫자의 연결선이 한 번에 일치하는 것을 계산하여 가능한 최대 일치를 구했다. 규칙은 I연결선은 반드시 다른 직선으로만 통과해야 한다는 것이다.그리고 이 두 직선이 대표하는 숫자는 같을 수 없다.II 숫자는 하나의 연결선만 있을 수 있다.
처음에는 별 생각이 없었고 dp도 생각했지만 구체적으로 어떻게 실현될지 몰랐어요.
저녁에 다시 자세히 보니 dp는 만들 수 있을 것 같아서 for순환을 많이 썼지만 제 생각대로 이해하면 간단할 것 같습니다.
pp[i][j]는 첫 번째 줄의 숫자가 i부터 n까지, 두 번째 줄의 숫자가 j에서 m까지 몇 개가 일치하는지 나타낸다.
dp[i][j-1]에 대해 b[j-1]과 첫 줄의 a[i]만 토론하면...a[n]의 일치 상황.
코드 보기:
# include<stdio.h>

# include<string.h>

int a[105],b[105],n,m,dp[105][105];

int main()

{

	int i,j,t,k,h,s,flag,max;

	scanf("%d",&t);

	while(t--)

	{

		scanf("%d%d",&n,&m);

		for(i=1;i<=n;i++)

			scanf("%d",&a[i]);

		for(j=1;j<=m;j++)

			scanf("%d",&b[j]);

		for(j=1;j<=m;j++)

		{

			dp[n][j]=0;

			dp[n+1][j]=0;

		}

		for(i=1;i<=n;i++)

		{

			dp[i][m]=0;

			dp[i][m+1]=0;

		}

		dp[n+1][m+1]=0;/*    ,            wa    */

		for(i=n-1;i>=1;i--)

			for(j=m-1;j>=1;j--)

			{

				max=dp[i][j+1];/*       b[j]     */

				for(k=i+1;k<=n;k++)

				{

					if(b[j]==a[k]) 

					{

						flag=0;

						for(h=j+1;h<=m;h++)

						{

							if(b[h]==b[j]) continue;/*            */

							for(s=i;s<k;s++)

							{

								if(b[h]==a[s]) {flag=1;break;}

							}

							if(flag==1) break;

						}

						if(flag==1) 

						{

							if(max<dp[k+1][h+1]+2) max=dp[k+1][h+1]+2;/*        */

						}

					}

				}

				dp[i][j]=max;

			}

			printf("%d
",dp[1][1]); } return 0; }

좋은 웹페이지 즐겨찾기