1410. Crack

http://acm.timus.ru/problem.aspx?space=1&num=1410

题目倒是不难,水题DP

就是题意理解起来有点困难,意思就是给你一段话,提取里面的单词

单词有小写字母和大写字母(某些单词的首部)组成 其他字符均为间隔,

而且不止一行,提取单词后,从里面选一定的单词,这些单词在原段中

不能相邻,然后让提取后所有单词总长最大

代码:

#include<iostream>

#include<stack>

#include<cstdio>

#include<queue>

#include<cstring>

#include<algorithm>

#include<vector>

#include<set>

#include<map>

#include<string>

#include<cmath>



using namespace std;



typedef long long ll;

typedef pair<int,int> pp;

const int INF=0x3f3f3f3f;

const int N=10003;

int d1[N],d2[N];

int a[N];

char s[N*100];

int main()

{

    //freopen("data.in","r",stdin);



    int ln=0;

    char c;

    while(scanf("%c",&c)!=EOF)

    s[ln++]=c;



    int l=0;

    while(s[l]==' '&&l<ln)++l;



    int n=0;

    int k=0;

    for(int i=l;i<=ln;++i)

    {

        if((s[i]<='z'&&s[i]>='a')||(s[i]<='Z'&&s[i]>='A'))

        ++k;

        else

        {

            if(k>0)

            a[n++]=k;

            k=0;

        }

        if(i==ln) break;

    }

    memset(d1,0,sizeof(d1));

    memset(d2,0,sizeof(d2));

    d1[0]=a[0];d2[0]=0;

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

    {

        d1[i]=a[i]+d2[i-1];

        d2[i]=max(d1[i-1],d2[i-1]);

    }



    cout<<max(d1[n-1],d2[n-1]);

    return 0;

}

 

你可能感兴趣的:(rack)