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

胡撦,O(KL^2)的dp可以过,亲测,266ms(顺便擠进1000名纪念)

Posted by KatrineYang at 2016-09-30 13:34:09 on Problem 1404 and last updated at 2016-09-30 13:37:27
In Reply To:一共2000组数据,时间复杂度大于O(K*L)的不用尝试提交了 Posted by:FutureCode at 2013-03-20 17:47:47
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;

int main() {
	int t;
	scanf("%d", &t);
	for(int ii = 0; ii < t; ii++){
		printf("Keypad #%d:\n", ii+1);
		int K,L;
		scanf("%d%d", &K, &L);
		char key[120], letter[120];
		scanf("%s%s", key, letter);
		int freq[120];
		for(int i = 0; i < L; i++){
			scanf("%d", &freq[i]);
		}
		int dp[120][120];
		int trc[120][120];
		int bfh[120] = {0};
		dp[0][0] = 0;
		for(int i = 1; i <= L; i++){
			bfh[i] = bfh[i-1] + freq[i-1];
		}
		for(int l = 1; l <= L; l++){
			for(int k = 1; k <= K && k <= l; k++){
				if(k==1){
					trc[l][k] = l;
					dp[l][k] = 0;
					for(int i = 0; i < l; i++){
						dp[l][k] += (i+1)*freq[i];
					}
				}
				else{
					dp[l][k] = 2147483647;
					int z = 0;
					for(int x = 1; x <= l-k+1; x++){
						z += (bfh[l]-bfh[l-x]);
						int tmp = z + dp[l-x][k-1];
						if(tmp <= dp[l][k]){
							dp[l][k] = tmp;
							trc[l][k] = x;
						}
					}
				}
			}
		}
		stack<int> res;
		int ll = L, kk = K;
		while(kk!=0){
			res.push(trc[ll][kk]);
			ll -= trc[ll][kk];
			kk --;
		}
		int cnt = 0;
		for(int i = 0; i < K; i++){
			int gs = res.top();
			res.pop();
			printf("%c: ", key[i]);
			for(int j = 0; j < gs; j++) printf("%c", letter[cnt+j]);
			printf("\n");
			cnt += gs;
		}
		printf("\n");
	}
	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