//HDU 4500
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REPV( i , a , b ) for ( int i = a ; i >= b ; -- i )
#define clear( a , x ) memset ( a , x , sizeof a )
const int MAXN = 25 ;
int f[MAXN][MAXN] ;
void work () {
int n , m ;
int sum ;
int r , c , mmax ;
while ( ~scanf ( "%d%d" , &n , &m ) && ( n || m ) ) {
clear ( f , 0 ) ;
REPF ( i , 1 , n )
REPF ( j , 1 , m )
scanf ( "%d" , &f[i][j] ) ;
mmax = 0 ;
REPF ( i , 1 , n )
REPF ( j , 1 , m ) {
sum = 0 ;
sum += f[i - 1][j] ;
sum += f[i + 1][j] ;
sum += f[i][j - 1] ;
sum += f[i][j + 1] ;
if ( f[i][j] > 0 )
sum = -sum ;
if ( sum > mmax )
mmax = sum , r = i , c = j ;
}
printf ( "%d %d %d\n" , r , c , mmax ) ;
}
}
int main () {
work () ;
return 0 ;
}
//HDU 4501
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REPV( i , a , b ) for ( int i = a ; i >= b ; -- i )
#define clear( a , x ) memset ( a , x , sizeof a )
const int MAXN = 105 ;
const int MAXK = 6 ;
int f[MAXN][MAXN][MAXK] ;
void work () {
int n , V1 , V2 , K ;
int cost1 , cost2 , val ;
int sum ;
while ( ~scanf ( "%d%d%d%d" , &n , &V1 , &V2 , &K ) ) {
clear ( f , 0 ) ;
sum = 0 ;
while ( n -- ) {
scanf ( "%d%d%d" , &cost1 , &cost2 , &val ) ;
if ( !cost1 || !cost2 ) {
sum += val ;
continue ;
}
if ( !val )
continue ;
REPV ( i , V1 , 0 )
REPV ( j , V2 , 0 )
REPV ( k , K , 0 ) {
if ( i >= cost1 )
f[i][j][k] = max ( f[i][j][k] , f[i - cost1][j][k] + val ) ;
if ( j >= cost2 )
f[i][j][k] = max ( f[i][j][k] , f[i][j - cost2][k] + val ) ;
if ( k >= 1 )
f[i][j][k] = max ( f[i][j][k] , f[i][j][k - 1] + val ) ;
}
}
printf ( "%d\n" , sum + f[V1][V2][K] ) ;
}
}
int main () {
work () ;
return 0 ;
}
//HDU 4502
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REPV( i , a , b ) for ( int i = a ; i >= b ; -- i )
#define clear( a , x ) memset ( a , x , sizeof a )
const int MAXN = 105 ;
const int MAXE = 1005 ;
struct Edge {
int v , c , n ;
Edge () {}
Edge ( int var , int val , int next ) :
v ( var ) , c ( val ) , n ( next ) {}
} ;
Edge edge[MAXE] ;
int adj[MAXN] , cntE ;
int money[MAXN] ;
void addedge ( int u , int v , int val ) {
edge[cntE] = Edge ( v , val , adj[u] ) ;
adj[u] = cntE ++ ;
}
void work () {
int n , m ;
int s , e , val ;
cntE = 0 ;
clear ( adj , -1 ) ;
clear ( money , 0 ) ;
scanf ( "%d%d" , &n , &m ) ;
while ( m -- ) {
scanf ( "%d%d%d" , &s , &e , &val ) ;
if ( e > n )
continue ;
addedge ( s , e , val ) ;
}
REPV ( u , n , 1 ) {
int tmp = 0 ;
for ( int i = adj[u] ; ~i ; i = edge[i].n ) {
int val = edge[i].c + money[edge[i].v + 1] ;
tmp = max ( tmp , val ) ;
}
money[u] = max ( money[u + 1] , tmp ) ;
}
printf ( "%d\n" , money[1] ) ;
}
int main () {
int T ;
scanf ( "%d" , &T ) ;
while ( T -- )
work () ;
return 0 ;
}