hdu 1224

DP 状态转移方程很简单。。。。但是输出坑了我无数次。。。太坑了。。。我开始还以为状态转移方程错了。。。。

AC代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
int index[1100];
struct straight{
	int x, y;
};

void out (int i)  
{  
    if (i==1)  
    {  
        printf("1");  
        return ;  
    }  
    out(index[i]);  
    printf("->%d",i);  
}  


int main(){
	struct straight str[100000];
	int v[1100], dp[1100];
	int t, n, m, Case = 1;

	cin >> t;
	while( t-- ){
		if( Case != 1 ){
			cout << endl;
		}
		cin >> n;
		for( int i = 1; i <= n; i++ ){
			cin >> v[i];
		}
		cin >> m;
		for( int i = 1; i <= m; i++ ){
			cin >> str[i].x >> str[i].y;
		}
		memset( dp, 0, sizeof( dp ) );
		memset( index, 0, sizeof( index ) );
		v[n+1] = 0;
		for( int i = 1; i <= n + 1; i++ ){
			int max = 0;
			int in = 0;
			for( int j = 1; j <= m; j++ ){
				if( str[j].y == i ){
					if( dp[str[j].x] + v[i] > max ){
						max = dp[str[j].x] + v[i];
						in = str[j].x;
					}
				}
			}

				dp[i] = max;
				index[i] = in;

		}


		printf( "CASE %d#\n", Case++ );
		cout << "points : " <<dp[n+1] << endl;
		cout << "circuit : ";
		out(index[n+1]);
		cout << "->" << 1 << endl;
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值