杨理垚的技术专栏

从明天起 尝遍人间冷暖

ZJU2025 I-Keyboard - 动态规划

题目大意:

在手机键盘N个按键上布置K个字符(1<=N<=K<=90),每个按键上可以布置任意多个字符,字符在键盘上的布局必须按照字符顺序。在手机上输入某个字符需要按键的次数等于这个字符在这个按键上排列的位置pi(和日常手机规则一样),每个字符都有一个使用频率fi,那么输入一个字符的平均费用为pi×fi。要求输出一种手机字符按键的布局方案,使得总平均输入费用最小。

分析:

题目好长,打开网页就没有读下去的欲望……

典型的动态规划题目。很多年前的动态规划看起来都很简单的样子。

令f[i][j]表示前i个按键以字符j结尾,所需要的最小费用。

令price(i,j)表示字符i到j连续排列到同一个按键上需要的费用。

初始时f[1][n]=price(1,n)

状态转移方程:f[i][j]=min{ f[i-1][k]+price(k+1,j) } (i-1<=k<j)

---------------------------------------------------------------------------------- 
/*
ZJU2025 I-Keyboard
*/
 
#include <stdio.h>
#include <string.h>
#define clr(a) memset(a,0,sizeof(a))
 
#define N 105
 
char keys[N],letters[N];
int a[N],f[N][N],g[N][N];
int n,m;
 
int price(int a[],int l,int r){
    int i,s=0;
    for(i=l;i<=r;i++){
        s+=a[i]*(i-l+1);
    }
    return s;
}
 
void prints(char s[],int l,int r){
    int i;
    for(i=l;i<=r;i++) printf("%c",s[i]);
}
 
void output(int key,int letter){
    if(key>1){
        output(key-1,g[key][letter]);
    }
    printf("%c: ",keys[key-1]);
    prints(letters,g[key][letter],letter-1);
    puts("");
}
 
int main()
{
    int i,j,k,T,Tn;
    int e,s;
   
    scanf("%d",&Tn);
    for(T=1;T<=Tn;T++){
        //input
        scanf("%d%d",&n,&m);
        scanf("%s %s",keys,letters);
        for(i=1;i<=m;i++)
            scanf("%d",&a[i]);
       
        //init
        clr(f); clr(g);
       
        //DP
        for(j=1;j<=m;j++) f[1][j]=price(a,1,j);
        for(i=2;i<=n;i++){
            for(j=1;j<=m;j++){
                f[i][j]=f[i-1][i-1]+price(a,i,j);
                g[i][j]=i-1;
                for(k=i;k<j;k++){
                    s=f[i-1][k]+price(a,k+1,j);
                    if(f[i][j]>s){
                        f[i][j]=s;
                        g[i][j]=k;
                    }
                }
            }
        }
              
        //output
        printf("Keypad #%d:/n",T);
        for(i=j=1;i<=n;i++){
            if(f[i][m]<f[j][m]) j=i;
        }
        output(n,m);
        puts("");
    }
   
    return 0;
}

 

阅读更多
文章标签: output 手机 c
个人分类: ZJU/PKU解题报告
想对作者说点什么? 我来说一句

动态规划动态规划动态规划

2008年11月17日 1.07MB 下载

算法合计之动态规划(高)

2010年08月11日 255KB 下载

计算机编程算法的动态规划问题

2010年04月28日 159KB 下载

动态规划~动态规划32讲~

2011年06月13日 275KB 下载

动态规划算法详解

2011年11月19日 442KB 下载

动态规划实验报告瞎子

2009年06月26日 149KB 下载

有用的动态网页设计制作

2010年03月13日 887KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭