博客
关于我
洛谷P1004方格取数(四维DP)
阅读量:252 次
发布时间:2019-03-01

本文共 2137 字,大约阅读时间需要 7 分钟。

链接:

同类题:

题意:给一个n*n矩阵(1<=n<=9)。从(1,1)到(n,n)走两次,第一次走过的方格处的值全变为0.求两条路径经过的所有值的和的最大值为多少。

思路:首先看见这一题,感觉并不是一眼能看懂的那种题。做惯了简单题,就不想思考了。为了改变这种坏习惯,我决定还是想一下这一题。最后想到的思路就是,第一次取路径最大值,然后再回溯回去,路径上的值全部赋0,再求一遍最大值。

写代码。。。过样例。。。提交。。。竟然还得了80分,只能说这个数据太水了,我都没打算能得多少分。

然后还是看了题解(真不知道应该什么时候看题解什么时候不看题解)。原来是思维数组(emmm,没涉及过)。看过思路之后,直接写代码,过了。方法还是挺简单的,但是没做过这种题,想不到。

四维DP模板题??dp[i][j][k][t]表示第一个人走(i,j)路径,第二个人走(k,t)路径,然后dp[i][j][k][t]=max(dp[i-1][j][k-1][t],dp[i-1][j][k][t-1],dp[i][j-1][k-1][t],dp[i][j-1][k][t-1])+mp[i][j]+mp[k][t];//注意i=k,j=t时减一个mp[i][j]。

最后贴代码:

#include 
#define ll long long#define ld long double#define pi acos(-1)#define pb push_back#define mst(a, i) memset(a, i, sizeof(a))#define pii pair
#define pll pair
#define fi first#define se second#define dbg(x) cout << #x << "===" << x << endl#define dbgg(i, x) cout << #x << "[" << i << "]===" << x[i] << endlusing namespace std;template
void read(T &x){T res=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){res=(res<<3)+(res<<1)+c-'0';c=getchar();}x=res*f;}void print(ll x){if(x<0){putchar('-');x=-x;}if(x>9)print(x/10);putchar(x%10+'0');}const ll maxn = 1 + 10;const ll mod = 1e9 + 7;ll n,mp[maxn][maxn];ll x,y,k;ll dp[maxn][maxn][maxn][maxn];ll gcd(ll a,ll b){return (b==0)?a:gcd(b,a%b);}ll qpow(ll a,ll p,ll mod){ll ans=1;a=a%mod;while(p){if(p&1)ans=(ans*a)%mod;p>>=1;a=(a*a)%mod;}return ans;}ll ksm(ll a,ll b){ll ret=1; while(b){if(b&1)ret=ret*a%mod;a=a*a%mod;b>>=1;} return ret;}int main() { int T = 1; // read(T); while (T--) { read(n); while(scanf("%lld%lld%lld",&x,&y,&k)!=EOF){ if(x==0&&y==0&&k==0) break; mp[x][y]=k; } for(ll i=1;i<=n;i++){ for(ll j=1;j<=n;j++){ for(ll k=1;k<=n;k++){ for(ll t=1;t<=n;t++){ dp[i][j][k][t]=max(max(dp[i-1][j][k-1][t],dp[i-1][j][k][t-1]),max(dp[i][j-1][k-1][t],dp[i][j-1][k][t-1]))+mp[i][j]+mp[k][t]; if(i==k&&j==t) dp[i][j][k][t]-=mp[i][j]; } } } } cout<
<

 

转载地址:http://ihst.baihongyu.com/

你可能感兴趣的文章
mysql执行计划
查看>>
MySQL执行计划 EXPLAIN参数
查看>>
MySQL执行计划【explain】,看这一篇就够啦!
查看>>
Mysql执行计划字段解释
查看>>
mysql执行计划怎么看
查看>>
MySQL执行计划解读
查看>>
mysql执行顺序与索引算法
查看>>
mysql批量update优化_Mysql中,21个写SQL的好习惯,你值得拥有呀
查看>>
mysql批量update操作时出现锁表
查看>>
MYSQL批量UPDATE的两种方式
查看>>
mysql批量修改字段名(列名)
查看>>
MySQL批量插入数据遇到错误1213的解决方法
查看>>
mysql技能梳理
查看>>
MySQL报Got an error reading communication packets错
查看>>
Mysql报错Can‘t create/write to file ‘/tmp/#sql_3a8_0.MYD‘ (Errcode: 28 - No space left on device)
查看>>
MySql报错Deadlock found when trying to get lock; try restarting transaction 的问题解决
查看>>
MySQL报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘
查看>>
Mysql报错Packet for query is too large问题解决
查看>>
mysql报错级别_更改MySQL日志错误级别记录非法登陆(Access denied)
查看>>
Mysql报错:too many connections
查看>>