//poj 1404
//sep9
#include<iostream>
using namespace std;
int k,l;
int frequency[128];
int cost[128][128],price[128][128],idx[128][128];
char keys[128],letters[128];
void ini()
{
memset(price,0x40,sizeof(price));
price[0][0]=0;
memset(cost,0,sizeof(cost));
for(int i=1;i<=l;++i)
for(int j=i;j<=l;++j)
cost[i][j]=cost[i][j-1]+frequency[j-1]*(j-i+1);
}
void cal()
{
for(int i=1;i<=k;++i)
for(int j=i;j<=l;++j)
for(int num=1;num<=j-i+1;++num){
int t=price[i-1][j-num]+cost[j-num+1][j];
if(t<=price[i][j])
price[i][j]=t,idx[i][j]=num;
}
}
void output(int K,int L)
{
if(K==0) return ;
output(K-1,L-idx[K][L]);
printf("%c: ",keys[K-1]);
for(int i=L-idx[K][L];i<L;++i)
putchar(letters[i]);
puts("");
}
int main()
{
int cases,t=0;
scanf("%d",&cases);
while(cases--){
scanf("%d%d%s%s",&k,&l,keys,letters);
for(int i=0;i<l;++i)
scanf("%d",&frequency[i]);
ini();
cal();
printf("Keypad #%d:\n",++t);
output(k,l);
puts("");
}
return 0;
}
poj 1404 I-Keyboard dp输出方案
最新推荐文章于 2021-01-25 16:42:05 发布