USACO :Longest Prefix解题报告

一维的dp,设dp[i]表示主串S中从i开始的最长的可组成的前缀,dp[1]就是所求,状态转移方程:

{dp[i]=max{dp[j]+j-i}  其中:i 到 j-1 的字串是属于集合P 且 j 要满足 i<j  && j< n &&   j<=i+10(最后这个限制很重要)
USER: li xiaopeng [xpli1]
TASK: prefix
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 3708 KB]
   Test 2: TEST OK [0.011 secs, 3708 KB]
   Test 3: TEST OK [0.000 secs, 3708 KB]
   Test 4: TEST OK [0.022 secs, 3708 KB]
   Test 5: TEST OK [0.065 secs, 3708 KB]
   Test 6: TEST OK [0.464 secs, 3724 KB]

All tests OK.

Your program ('prefix') produced all correct answers! This is your submission #9 for this problem. Congratulations!

/*
ID: xpli1
PROG: prefix
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define IN    fin
#define OUT    fout
#define max(a,b) (((a) > (b)) ? (a) : (b))
ifstream fin ("prefix.in", ios::in);
ofstream fout("prefix.out",ios::out);
string              P[201];
string    S;
int     max_len;
int     dp[200001];
int main(){
 string temp;
 int i,j,k,index = 0;
 while(IN >> temp, temp != ".") { P[index++] = temp; }
 while(IN >> temp) { S += temp; }
 int lens = S.length();
 for(i = lens - 1; i >= 0; i--){
  for(j = i + 1; j <= lens && j <= i + 10; j++){
   for(k = 0; k < index; k++){
    if(P[k].length() != j-i) continue;
    
    if(S.compare(i,j-i,P[k]) == 0) {  dp[i] = max(dp[i],dp[j] + j - i); }
   }
   
  }
 }
 OUT << dp[0] << endl;
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值