zoj 1206

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yhf_naive/article/details/61191921

感想:难题,这道想了我很久,最后还是参考了别人的博客才懂

注意点:1.字符串的值使用可以用hash实现,最终字符串添加字符需要一个一个添加而不是3个3个添加

2.运用递推关系建立dp方程

3.dp方程从后往前建立,这样可以保证最终字符串最小

代码参考自:

http://www.cppblog.com/Ayue/archive/2011/11/10/159937.html

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <limits.h>
using namespace std;
#define inf INT_MAX
int f[10010][10][10],pre[10010][10][10],n,m,w[1010];
int main(){
    int i,j,k,ans,p,q,tem,x,y,now;
    while(scanf("%d%d",&m,&n)!=EOF){
        memset(w,0,sizeof(w));
        for(i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            w[x]=y;
        }
        for(j=0;j<=9;j++){
            for(k=0;k<=9;k++){
                f[2][j][k]=0;
            }
        }
        for(now=3;now<=n;now++){
            for(i=0;i<=9;i++){
                for(j=0;j<=9;j++){
                    f[now][i][j]=-inf;
                    for(k=0;k<=9;k++){
                        if(f[now-1][j][k]+w[100*i+10*j+k]>f[now][i][j]){
                            f[now][i][j]=f[now-1][j][k]+w[100*i+10*j+k];
                            pre[now][i][j]=k;   
                        }
                    }
                }
            }
        }
        ans=-inf;
        for(i=0;i<=9;i++){
            for(j=0;j<=9;j++){
                if(f[n][i][j]>ans){
                    ans=f[n][i][j];
                    p=i; q=j;
                }
            }
        }
        i=n;
        while(i>2){
            printf("%d",p);
            tem=pre[i][p][q];
            p=q; q=tem;
            i--;
        }
        printf("%d%d\n",p,q);
    }
}


猜你喜欢

转载自blog.csdn.net/yhf_naive/article/details/61191921
ZOJ