• 【codevs4829】数字三角形++


    题目大意:给定一个数字三角形,求从 (1,1) 到第 N 行的路径经过的权值之和加上该路径上任意一个点的权值之和的最大值。

    题解:任意加一条路径上的某个值,可以看成是多了一次选择的权利,即:在每次经过一个点时,若没使用过权利,可以选择使用或者不使用,若已经使用过,则不能再使用。因此有状态 (dp[i][j][0/1])表示经过前 i 行,位置在 (i,j) 时,是否用过这次权利。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    
    inline int read(){
    	int x=0,f=1;char ch;
    	do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
    	do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
    	return f*x;
    }
    
    int n,ans,mp[maxn][maxn],dp[maxn][maxn][2];
    
    void read_and_parse(){
    	n=read();
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=i;j++)
    			mp[i][j]=read();
    	dp[1][1][0]=mp[1][1],dp[1][1][1]=mp[1][1]<<1;
    }
    
    void solve(){
    	for(int i=1;i<n;i++)
    		for(int j=1;j<=i;j++){
    			dp[i+1][j][0]=max(dp[i+1][j][0],dp[i][j][0]+mp[i+1][j]);
    			dp[i+1][j][1]=max(dp[i+1][j][1],max(dp[i][j][1]+mp[i+1][j],dp[i][j][0]+(mp[i+1][j]<<1)));
    			dp[i+1][j+1][0]=max(dp[i+1][j+1][0],dp[i][j][0]+mp[i+1][j+1]);
    			dp[i+1][j+1][1]=max(dp[1+1][j+1][1],max(dp[i][j][1]+mp[i+1][j+1],dp[i][j][0]+(mp[i+1][j+1]<<1)));
    		}
    	for(int i=1;i<=n;i++)ans=max(ans,dp[n][i][1]);
    	printf("%d
    ",ans);
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    #region...#endregion: C# syntax
    Regular Expression in C#
    北京邮电大学网络与交换技术国家重点实验室
    C#: 得到系统中的环境变量(源代码)
    Contrasting C# and Java Syntax(摘录)
    Using ZipLib to create a Zip File in C#
    SQL Server DO's and DONT's 摘录
    SQL View 的使用语法与原则
    时隔两年
    VS 里的快捷键定制
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9994429.html
Copyright © 2020-2023  润新知