20160316 Codevs 1018 单词接龙,1166 矩阵取数(60'),1297 硬币,1009 产生数

来源:互联网 发布:投诉淘宝卖家有补偿吗 编辑:程序博客网 时间:2024/06/06 21:00

单词接龙


#include<cstdio>#include<cstring>char s[25][100],buf[20*100],s1[100],s2[100],ss[5];int v[25],n,ans=0;void dfs(int len){    int t=strlen(buf);    ans=ans>t?ans:t;    for(int i=0;i<n;i++)if(v[i]<2){        int x=strlen(s[i]),ok=0,j;        for(j=1;j<((len<x)?len:x)&&!ok;j++){            strncpy(s1,buf+t-j,j);strncpy(s2,s[i],j);            s2[j]=s1[j]=0;            if(strcmp(s1,s2)==0)ok=1;        }        if(ok){            v[i]++;            strcat(buf,s[i]+j-1);            dfs(strlen(s[i]));            buf[t]=0;            v[i]--;        }    }}int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%s",s[i]);    scanf("%s",ss);    for(int i=0;i<n;i++)if(ss[0]==s[i][0]){        memset(v,0,sizeof(v));        strcpy(buf,s[i]);        v[i]++;        dfs(strlen(s[i]));    }    printf("%d\n",ans);    return 0;}/*找到前缀词,从他开始,往后试着用每个单词拼它后面,迭代加深搜索,剪枝:1. 没有与当前龙没有公共部分/或者存在包含关系2. 已经使用了2次的单词*/ 

矩阵取数

高精度看着就烦,写了个dp模型,double上去过了6成数据

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;int n,m,a[100][100];double dp[100][100],ans=0,cnt=0;int main(){    int n;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            scanf("%d",&a[i][j]);    for(int x=1;x<=n;x++){        memset(dp,0,sizeof(dp));        ans=0;        for(int k=1;k<=m;k++) //取了k个数        for(int i=0,j;i<=k;i++){ //左边取了i个            j=k-i;//右边取了j个            dp[i][j]=max((i==0)?0:dp[i-1][j]+a[x][i]*pow(2,k),dp[i][j-1]+a[x][m-j+1]*pow(2,k));    //左边取一个,或者右边取一个,选最大的            ans=max(ans,dp[i][j]);        }        cnt+=ans;    }    printf("%lf\n",cnt);    return 0;}



硬币

#include<cstdio>int w,n,ans;char val[100005],r[105][100005];struct coin{    int v,a,b;}a[10];void dfs(int wt,int vl){ //搜索变量设置为总重量和总面值    if(wt>w)return;    if(r[wt][vl])return;//记忆    if(wt==w){        if(!val[vl]){            ans++;            val[vl]=1;        }        return ;    }    r[wt][vl]=1;    for(int i=0;i<n;i++)        for(int j=a[i].a;j<=a[i].b;j++)            dfs(wt+j,vl+a[i].v);}int main(){    scanf("%d%d",&w,&n);    for(int i=0;i<n;i++)        scanf("%d%d%d",&a[i].v,&a[i].a,&a[i].b);    dfs(0,0);    printf("%d\n",ans);    return 0;}/*一开始没想到这么搜索,表示很多搜索的阶段变量都在题里,恩,长记性了,关键是题型看得太少了...*/


产生数

状态太差,挑了道水图给A了

#include<cstdio>char s[33],g[10][10],r[33][10];int k,cnt;long long dfs(int k,int x){ //对于第k个位,取值x    if(r[k][x])return 0;    long long  t=1;    r[k][x]=1;    for(int i=0;i<10;i++)if(g[x][i]){        t+=dfs(k,i);    }    return t;}int main(){    int x,y;    scanf("%s%d",s,&k);    for(int i=0;i<k;i++){        scanf("%d%d",&x,&y);        if(x!=y)g[x][y]=1;    }    long long ans=1;    for(int i=0;s[i];i++){         long long t=dfs(i,s[i]-'0');        ans*=t;    //乘法原理    }    printf("%lld\n",ans);    return 0;}


Finished!



0 0
原创粉丝点击