숫자nullRQNOJ-302- 단어 개수 집계 - 영역 dp

3606 단어 null
개장 은 숫자 null 에 관한 게시물 이다
아이디어:
s[i][j]: i에서 j까지의 구간에 i로 끝낸 사전이 있으면 1이고, 그렇지 않으면 0이다.
sum[i][j]: i에서 j까지의 구간에 포용되는 사전의 수
    if(s[i][j]==1)sum[i][j]=sum[i+1][j]+1;
    else sun[i][j]=sum[i+1][j];
dp[i][j]: 0~j의 구간에서 i분을 분배하고 포함된 사전의 총계를 나타낸다.
    dp[i][j]=dp[i-1][k]+sum[k+1][j](i-2<=k    dp[1][j]=sum[1][j];
매일 같은 이치
신념은 높고 큰 빌딩의 기둥이다. 신념이 없으면 그저 흩어진 벽돌과 기와일 뿐이다.신념은 도도한 강바닥으로 그것이 없으면 범람하는 파도만 있을 뿐이다.신념은 활활 타오르는 불길의 별이다. 신념이 없으면 차가운 나무 손잡이 하나만 있다.신념은 원양 기선의 본체이며, 신념이 없으면 마비된 거대만 남는다.
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<stdlib.h>
#define INF_MAX 0x7fffffff
#define INF 999999
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node
{
    int u;
    int v;
    int w;
    bool friend operator < (node a, node b){
        return a.w < b.w;
    }
}edge[1001];
int gcd(int n,int m){if(n<m) swap(n,m);return n%m==0?m:gcd(m,n%m);}
int lcm(int n,int m){if(n<m) swap(n,m);return n/gcd(n,m)*m;}
char dic[10][201];
char str[201];
char  st[21];
int sum[201][201];
int s[201][201];
int p,k,ss;
int main()
{
    int i,j,n;
    scanf("%d%d%*c",&p,&k);
    for(i=0;i<p;i++)
    {
        gets(st);
        for(j=i*20;j<i*20+20;j++)
        {
            str[j]=st[j-i*20];
        }
    }
    n=p*20;
    scanf("%d%*c",&ss);
    for(i=0;i<ss;i++)
    {
        gets(dic[i]);
    }
    int mi,is,ks;
    for(i=0;i<n;i++)
    {
        mi=n;
        for(j=0;j<ss;j++)
        {
            if(str[i]==dic[j][0])
            {
                for(ks=0;ks<strlen(dic[j])&&(i+ks)<n;ks++)
                {
                    if(str[ks+i]!=dic[j][ks])break;
                }
                if(ks==strlen(dic[j]))mi=min(mi,i+ks-1);
            }

        }
        for(is=mi;is<n;is++)
        {
            s[i][is]=1;
        }
    }
    for(i=0;i<n;i++)
    sum[n-1][i]=s[n-1][i];
    for(i=n-2;i>=0;i--)
    {
        for(j=i;j<n;j++)
        {
            if(s[i][j]==1)sum[i][j]=sum[i+1][j]+1;
            else sum[i][j]=sum[i+1][j];
        }
    }
    int dp[10][201];
  /*  for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%2d ",sum[i][j]);
        }
        puts("");
    }*/
    for(i=0;i<n;i++)
    {
        dp[1][i]=sum[0][i];
    }
    for(i=2;i<=k;i++)
    {
        for(j=0;j<n;j++)
        {
            dp[i][j]=0;
            for(ks=i-2;ks<j;ks++)
            {
                dp[i][j]=max(dp[i][j],dp[i-1][ks]+sum[ks+1][j]);

            }
        }
    }
    cout<<dp[k][n-1]<<endl;
    return 0;
}

글이 끝나면 프로그래머의 우스갯소리 어록을 공유해 드리겠습니다. 합격한 프로그래머는'지구 파괴'와 같은 프로그램을 쓰지 않습니다. 그들은 함수를'행성 파괴'라고 써서 지구를 하나의 매개 변수로 전달합니다.

좋은 웹페이지 즐겨찾기