zoukankan      html  css  js  c++  java
  • 乌龟棋


    #include<bits/stdc++.h> using namespace std; int x,n,m,f[41][41][41][41],a[351],b[121],g[5]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) { cin>>x; g[x]++; } f[0][0][0][0]=a[1]; for(int i=0;i<=g[1];i++) for(int j=0;j<=g[2];j++) for(int k=0;k<=g[3];k++) for(int l=0;l<=g[4];l++) { int r=1+i+2*j+3*k+4*l; if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+a[r]); if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+a[r]); if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+a[r]); if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+a[r]); } cout<<f[g[1]][g[2]][g[3]][g[4]];//记住,这道题虽然简单,但是需要从零开始计算,你不摸牌也是状态。 return 0; }
    考试时:在考试时看到这道题我知道是动归,但完全没有思路,也找不到状态转移方程,真不知道那些做出来的人在考试时是怎么想到的。我做梦都没想到居然要用四重循环,而且思路还很简单。
    考试后:简单来讲就是将四种牌的数量作为自己的状态,数量不同这一步到达的那个点也不同,不过到达的那个点不止要考虑四张牌的数量,由于他最开始便把起点1的数据给算了,所以需要在算走到哪里的时候需要加1。
    然后就是我自己犯的一些小错误。当我看懂了思路自己编译完了后,出错了。与题解相比对很久,我才找到那隐藏的很深得错误,我是从1开始的循环,而因为平时做动归题大多这样也可以吧,就习惯了。但这一次它没有牌也算作状态,所以吃了个教训。
     
  • 相关阅读:
    CentOS 6.5系统使用yum方式安装LAMP环境
    省市区三级联动—PCASClass
    javascript进击(九)参考手册
    javascript进击(八)JSON
    javascript进击(七)Ajax
    javascript进击(六)Jquery
    javascript进击(五)JS对象
    javascript进击(四)HTML DOM
    javascript进击(三)简介
    javascript进击(一)简介
  • 原文地址:https://www.cnblogs.com/xxmxxm/p/10938696.html
Copyright © 2011-2022 走看看