数目nullRQNOJ302统计单词个数区域dp

改章节是一篇关于数目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<j)

    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;
}

文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。

原文地址:https://www.cnblogs.com/jiangu66/p/3085935.html