Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

也是DP,C++

Posted by Idy002 at 2014-08-19 18:54:08 on Problem 1850
In Reply To:DP做法。 Posted by:The_Dawn at 2011-04-17 11:50:48
dp[l][s] : 以s开头长度为l的串有多少个

#include <cstdio>
#include <cstring>

char str[12];
int len;
long long dp[27][27];
long long ans;

void fill() {
	for( int s=1; s<=26; s++ )
		dp[1][s] = 1;
	for( int l=2; l<=len; l++ )
		for( int s=1; s<=27-l; s++ )
			for( int i=s; i<=27-l; i++ )
				dp[l][s] += dp[l-1][i+1];
}

int main() {
	scanf( "%s", &(str[1]) );
	len = strlen(&str[1]);
	for( int i=1; i<len; i++ )
		if( str[i]>=str[i+1] ) {
			printf( "0\n" );
			return 0;
		}
	fill();
	for( int i=1; i<len; i++ )
		for( int s=1; s<=27-i; s++ )
			ans += dp[i][s];
	for( int i=0; i<len; i++ ) 
		for( int s= i==0?'a':str[i]+1 ; s<str[i+1]; s++ )
			ans += dp[len-i][s-'a'+1];
	printf( "%lld\n", ans+1 );
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator